我试图在MATLAB中找到矩阵中所有非零元素的坐标。我知道find
使这很容易。问题是我需要在填充之前定义矩阵的长度。我认为使用find
是不可能的,因为它会创建自己的向量。
所以我必须找到另一种方式。如果我正在寻找1个元素,它也会很容易。让我举个例子。假设我的矩阵M
为500×500,其中60
个。我想找到坐标。所以我可以从:
for i = 1:500
for j = 1:500
if M(i,j) == 1
row = i;
col = j;
end
end
end
但我想要多一点,我需要在填充之前定义矢量的长度。所以我会赌博,矩阵中少于100个:
v = zeros(1,100)
w = zeros(1,100)
我基本上想要填充此向量如下。假设我已经填充了向量的N
个元素,所以下一个将是:
for i = 1:500
for j = 1:500
if M(i,j) == 1 && i ~= v(1) && i ~= v(2) && ... && i ~= v(N) && j ~= v(1) && ... && i ~= v(N)
v(N+1) = i
w(N+1) = j
end
end
end
所以我需要另一个包含所有这些的for循环,它将遍历向量v
和w
的元素,我需要一些循环来确保正在使用正确的if语句
有没有人知道如何做到这一点?
亲切的问候,
杰西
答案 0 :(得分:3)
这是另一种方式,很好&浪费:
[jj,ii] = meshgrid(1:size(M,2),1:size(M,1));
inds = M~=0;
ii = ii(inds);
jj = jj(inds);
答案 1 :(得分:2)
老实说,我无法理解find
的错误
但是,如果您坚持使用嵌套循环实现自己的实现,那么
v = NaN(100,1);
w = NaN(100,1); % pre-allocate
ii=1;
for row=1:size(M,1)
for col=1:size(M,2)
if M(row,col) == 1
v(ii)=row;
w(ii)=col;
ii=ii+1; %counts howmany elements were found
end
end
end
v(isnan(v))=[]; %discard redundent elements
w(isnan(w))=[];