ent*_*ree 3 optimization performance matlab matrix
如何转动矩阵:
[ 0.12 0.23 0.34 ;
0.45 0.56 0.67 ;
0.78 0.89 0.90 ]
Run Code Online (Sandbox Code Playgroud)
进入一个带有一堆行的'坐标'矩阵?
[ 1 1 0.12 ;
1 2 0.23 ;
1 3 0.34 ;
2 1 0.45 ;
2 2 0.56 ;
2 3 0.67 ;
3 1 0.78 ;
3 2 0.89 ;
3 3 0.90 ]
Run Code Online (Sandbox Code Playgroud)
(行的排列是无关紧要的,只有数据在这个结构中才重要)
现在我正在使用for循环,但这需要很长时间.
这是一个使用选项ind2sub:
mat= [ 0.12 0.23 0.34 ;
0.45 0.56 0.67 ;
0.78 0.89 0.90 ] ;
[I,J] = ind2sub(size(mat), 1:numel(mat));
r=[I', J', mat(:)]
r =
1.0000 1.0000 0.1200
2.0000 1.0000 0.4500
3.0000 1.0000 0.7800
1.0000 2.0000 0.2300
2.0000 2.0000 0.5600
3.0000 2.0000 0.8900
1.0000 3.0000 0.3400
2.0000 3.0000 0.6700
3.0000 3.0000 0.9000
Run Code Online (Sandbox Code Playgroud)
请注意,与您的示例相比,索引是相反的.
A = [ .12 .23 .34 ;
.45 .56 .67 ;
.78 .89 .90 ];
[ii jj] = meshgrid(1:size(A,1),1:size(A,2));
B = A.';
R = [ii(:) jj(:) B(:)];
Run Code Online (Sandbox Code Playgroud)
如果你不介意不同的订单(根据你的编辑),你可以更容易地做到:
[ii jj] = ndgrid(1:size(A,1),1:size(A,2));
R = [ii(:) jj(:) A(:)];
Run Code Online (Sandbox Code Playgroud)
除了生成行/列索引外meshgrid,还可以使用以下所有三个输出find:
[II,JJ,AA]= find(A.'); %' note the transpose since you want to read across
M = [JJ II AA]
M =
1 1 0.12
1 2 0.23
1 3 0.34
2 1 0.45
2 2 0.56
2 3 0.67
3 1 0.78
3 2 0.89
3 3 0.9
Run Code Online (Sandbox Code Playgroud)
有限的申请,因为零丢失.令人讨厌,但正确的解决方法(感谢user664303):
B = A.'; v = B == 0; %' transpose to read across, otherwise work directly with A
[II, JJ, AA] = find(B + v);
M = [JJ II AA-v(:)];
Run Code Online (Sandbox Code Playgroud)
不用说,我会推荐其他解决方案之一.:)特别ndgrid是,获取行,col inds是最自然的解决方案.