我有一个三维维度,例如u
。我还有另一个3维矩阵,例如B
。假设u
和B
的尺寸为CxTxW
。对于u
的每个元素,我希望执行以下操作:
如果u
> 0,则同时报告u
的值以及它所在的相应T
维度以及B/u
的相应元素。如果u
为0,则用正值T
和{{1}来报告下一个C
(对于相同的W
,u
) }和相应的T
元素。在下面的代码中,我将B/u
称为B/u
。
以下链接的问题以非常有效的方式回答了C = 1(即二维)的问题。我可以在c周围编写一个for循环,并为C的每个元素重复链接的答案,但我希望在没有for循环的情况下执行。
Vectorizable FIND function with if statement MATLAB
以下是带有循环的解决方案:
benefit
没有for循环怎么办?
答案 0 :(得分:0)
您可以将整个对象置换为T x W
矩阵,而不必将一行重塑为T x CW
矩阵:
>> C = 4; T = 5; W = 3;
>> u = reshape(1:C*T*W, C, T, W) % generate sample u
u =
ans(:,:,1) =
1 5 9 13 17
2 6 10 14 18
3 7 11 15 19
4 8 12 16 20
ans(:,:,2) =
21 25 29 33 37
22 26 30 34 38
23 27 31 35 39
24 28 32 36 40
ans(:,:,3) =
41 45 49 53 57
42 46 50 54 58
43 47 51 55 59
44 48 52 56 60
>> du = reshape(permute(u, [2 1 3]), T, [])
du =
1 2 3 4 21 22 23 24 41 42 43 44
5 6 7 8 25 26 27 28 45 46 47 48
9 10 11 12 29 30 31 32 49 50 51 52
13 14 15 16 33 34 35 36 53 54 55 56
17 18 19 20 37 38 39 40 57 58 59 60
您在du
上的其余代码应保持不变(添加虚拟行除外)。
倒数是:
>> permute(reshape(du, T, C, W), [2 1 3])
ans =
ans(:,:,1) =
1 5 9 13 17
2 6 10 14 18
3 7 11 15 19
4 8 12 16 20
ans(:,:,2) =
21 25 29 33 37
22 26 30 34 38
23 27 31 35 39
24 28 32 36 40
ans(:,:,3) =
41 45 49 53 57
42 46 50 54 58
43 47 51 55 59
44 48 52 56 60
我不知道这种解决方案是否真的更快。