【发布时间】:2016-09-04 10:11:34
【问题描述】:
我需要获取矩阵中所有对角线的索引。矩阵可以是非正方形的。
diag 函数给出了值,但我需要坐标。因此,例如:[1 2 3; 4 5 6; 7 8 9],我想要[1 1; 2 2; 3;3] 加上[2 6] 和3,因为它们是矩阵的上对角线,下面相同,即[4 8] 和7。所以完整的索引列表是:[1 1; 2 2; 3 3], [1 2; 2 3], [1 3], [2 1], [3 2], [3 1]。
而且我在另一个对角线方向也需要这个......
它需要适用于任何形状的矩阵,即不仅仅是方形矩阵,包括向量(即 1xn 和 nx1) - 但我想我可以测试最后两种情况并分别处理。
编辑: 一个非方阵的例子是这个 3x2 的:
1 2
3 4
5 6
在这种情况下,我需要的索引是:
[1 1; 2 2]
[2 1; 3 2]
[1 2]
[3 1]
然后对角线以另一种方式运行......
我知道diag 函数并且可以编写一些代码来迭代矩阵,但是我不知道如何轻松地将这些值转换为索引。
至于我为什么需要这个:这是我在 MatLab 中做的一门在线课程。编程介绍,使用 MatLab。我是一名经验丰富的程序员,但我对 MatLab 不熟悉,我想进一步了解它。
这个问题要求我们在任何方向上找到任何n 数字的最大乘积,即行、列和对角线(双向)。问题是我们不返回产品,我们返回构成该产品的元素的索引。
我希望这能提供更多信息。
编辑 2: 很抱歉没有回复你们,我一直忙于做其他事情。当我第一次在这里发帖时,我以为我遗漏了一些东西,而这需要几行。但这比这更棘手,所以你们发布的代码将花费我更多的时间来阅读和理解等。但我希望今天做到这一点并接受一个作为答案。谢谢大家的回复。
【问题讨论】:
-
输出的形状应该是什么?你的
alt_diag是否也得到对角线的位置(-2,-1,0,1,2)?你能提供一个非方阵的例子(输入和输出)吗? -
你打算如何处理这些索引?您需要索引本身,还是需要获取值并对它们执行一些操作?如果是后者,您可以使用
diag检索任何对角线的值,即使是在非方阵上。 -
好的,所以输出的形状需要是这些索引的列表。所以对于上面的2x2矩阵,索引其实是:[1 1; 2 2; 3 3], [1 2; 2 3]、[1 3]、[2 1]、[3 2]、[3 1]。我已经更新了上面的问题。
-
由于是家庭作业,我不会提供完整的答案,但您应该能够定义对角线
M(i,i),然后使用线性索引来移动它们。然后手动(这很容易)转换为 (i,j) 索引或使用sub2ind。如果您使用线性索引,这应该很简单。将对角线向右移动与idxArray = idxArray+size(M,1)相同。向下移动对角线只会是idxArray=idxArray+1。请记住对角线可能会变短... -
@davo36 关于您的编辑,不用担心。慢慢来,了解问题和解决方案,如果您有任何问题,请与我们联系。
标签: matlab matrix octave diagonal