我在matlab中有一个m by n矩阵,希望找到每个反对角线元素的索引(行、列)。例如,对于4x3矩阵,我希望有以下索引:
antidiag1 = (1,1)
antidiag2 = (2,1) , (1,2)
antidiag3 = (3,1) , (2,2), (1,3)
antidiag4 = (4,1) , (3,2), (2,3)
antidiag5 = (4,2) , (3,3)
antidiag3 = (4,3) 在上面的示例(m,n)=(row, column)中。为了说明我所说的反对角线元素的含义,请参阅下面的矩阵,其中红线是反对角线。

如何找到指数?
发布于 2022-10-23 13:08:22
提取元素的最简单的解决方案是水平镜像矩阵,然后找到规则对角线:
out = diag( flip(in, 2), k );k这里的主对角线为0,对主对角线为正,对于下面的对角线为负值,参见diag。
要找到指数本身要复杂得多。首先用一个循环来生成候选对,然后找出哪些对是有效的:
第一对是diagonal.
i=1-k,j=n,n是矩阵的宽度,k是您迭代地从j中减去1到i的1,直到j是1。H 214H 115i=1-k>最后删除d16小于1或大于D17的对,矩阵的高度。H 218F 219这个过程并不需要一个循环,循环进程可以被矢量化。不过,用这种方式来形容还是比较容易的。
在代码中,我们可以这样写(未经测试!):
[m,n] = size(A);
i = (1:n)-k;
j = n:-1:1;
invalid = (i < 1) | (i > m);
i(invalid) = [];
j(invalid) = [];发布于 2022-10-24 02:18:48
下面的脚本是这个问题的解决方案,适用于正方形和矩形二维矩阵。
clear all;close all;clc
A1=randi([-10 10],3,4)
sz1=size(A1)
nA2=reshape([1:1:prod(sz1)],sz1)
nd=sum(sz1) % amount diagonals
C1={} % init result cell
for k=-floor(nd/2):1:floor(nd/2)
a2 = diag( flip(nA2, 2), k )
[row,col]=ind2sub(sz1,a2)
C1={C1{:} [row col]}
end
C1(1)=[] % sought indexes
for k=1:1:size(C1,2)
C1{k}
end解决方案包含在单元格C1中。
在MATLAB中读取单元元素的实际内容,使用花括号索引,如下所示
C1{1}
=
3 4
C1{2}
=
2 4
3 3
C1{3}
=
1 4
2 3
3 2使用常规括号进行索引时,MATLAB返回所查找的元素,但在单元格类型中返回。
C2(2)
1×1 cell array
{2×2 double}若要访问解决方案索引的单个对,请使用以下符号
C1{3}(1,:)
=
1 4
C1{3}(2,:)
=
2 3
C1{3}(3,:)
=
3 2可以生成实际变量antidiag1 antidiag2 .带evalin命令
https://stackoverflow.com/questions/74171081
复制相似问题