作者sppmg (sppmg)
看板MATLAB
标题Re: [讨论] 如何输出矩阵中符合条件的座标?
时间Sun Jun 3 15:35:19 2018
如果你要用回圈处理的话(matlab 还是建议用「向量化」、内建指令等方式比较快)
f=[0 0 0 0 0 1 0 0 0;0 0 0 1 0 0 0 0 1;0 1 0 0 0 0 1 0 0] ;
count = 1 ; % 结果记数
ans_ind = zeros(numel(f), 2); % 预配置空间
% 或是我个人比较喜欢下面这种,据说比较快
% ans_ind(numel(f), 2) = 0 ;
for i=1:size(f,1)
for j=1:size(f,2)
if f(i,j)==1
ans_ind(count, :) = [i, j] ;
count = count +1 ;
end
end
end
% 消去多余空间
if count > 1
ans_ind = ans_ind(count-1, :) ;
end
※ 引述《qwerty754892 (Q仔)》之铭言:
: 令f矩阵为下
: 0 0 0 0 0 1 0 0 0
: 0 0 0 1 0 0 0 0 1
: 0 1 0 0 0 0 1 0 0
: 将f矩阵中,值为1的座标(x,y)标出
: 例如:(1,6)、(2,4)、(2,9)...
: clear all
: close all
: clc
: f=[0 0 0 0 0 1 0 0 0;0 0 0 1 0 0 0 0 1;0 1 0 0 0 0 1 0 0]
: for i=1:size(f,1)
: for j=1:size(f,2)
: if f(i,j)==1
: X(i)=i
: Y(j)=j
: end
: end
: end
: 我想得到的结果应该是
: x=[1 2 2 ...]
: y=[6 4 9 ...]
: 但我得到的数值为
: x=[1 2 3]
: y=[0 2 0 4 0 6 7 0 9]
: 大概知道原因,是i=1的时候
: 图像就已经抓到f值是1了
: 所以x轴的部分就给1
: 但是y轴的部分根本还没带入,就已经符合条件
: 所以得到的y会有0出现
: 那我改写成这样
: clear all
: close all
: clc
: f=[0 0 0 0 0 1 0 0 0;0 0 0 1 0 0 0 0 1;0 1 0 0 0 0 1 0 0]
: %设一个 P矩阵储存(1,1)、(1,2)、(1,3)....去带入
: for i=1:size(f,1)
: for j=1:size(f,2)
: P=[i j]
: if f(P(1),P(2))==1
: X(i)=P(1)
: Y(j)=P(2)
: end
: end
: end
: 但结果还是跟原本一样,没有办法正确输出
: 後来找到一个指令是[x y]=find(f==1)
: 得到结果如下
: x =
: 3
: 2
: 1
: 3
: 2
: y =
: 2
: 4
: 6
: 7
: 9
: 也就是得到(3,2) (2,4) (1,6).... 这样
: 能够正确输出座标了,但还是不服气
: 想知道我的写法到底哪里不行,要怎麽改
: 请各位ML大神指导一下,谢谢。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 115.82.147.156
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/MATLAB/M.1528011323.A.719.html
※ 编辑: sppmg (115.82.147.156), 06/03/2018 15:38:13
※ 编辑: sppmg (115.82.147.156), 06/03/2018 15:40:19
2F:→ qwerty754892: 结果好像不是座标?我没上过正课 觉得好弱…… 06/03 17:45
3F:→ rauljoker: 可以把 %消去多余空间以下的指令注解掉,应该就可以记 06/03 18:22
4F:→ rauljoker: 录全部数值为1的位置。另外我想问一下你的X,Y座标是分 06/03 18:22
5F:→ rauljoker: 别为那两个方向?可能方向会有点不太一样 06/03 18:22
6F:→ sppmg: 抱歉漏了「1:」 ans_ind(1:count-1, :) ; 06/03 18:34