是否有一种有效的方法可以在Matlab中重新编码多维数组的元素,而不必一个个地重新编码每个元素?
m=[1,2,0;3,4,0]
m(:,:,2)=[2,0,1;0,4,3]
r = [11,22,33,44]
例如,如何使用m
(即r
,1=11
,2=22
和{ {1}}。
答案 0 :(得分:1)
使用:
运算符应该很容易,请参见以下代码。假设:m
中的值始终与r
中的索引相对应。我稍微修改了示例输入,以便您看到省略了r
中没有相应索引(很可能是m(i) > numel(r)
)的值。
% Slightly modified input.
m = [1, 2, 0; 3, 4, 0];
m(:, :, 2) = [2, 0, 1; 0, 5, 3]
% Recode vector.
r = [11, 22, 33, 44];
% Get indices in m which correspond to recode elements.
idx = ((m(:) > 0) & (m(:) <= numel(r)));
% Recode elements in m.
m(idx) = r(m(idx))
输出:
m =
ans(:,:,1) =
1 2 0
3 4 0
ans(:,:,2) =
2 0 1
0 5 3
m =
ans(:,:,1) =
11 22 0
33 44 0
ans(:,:,2) =
22 0 11
0 5 33
答案 1 :(得分:1)
>> m(m~=0) = r(nonzeros(m))
m =
ans(:,:,1) =
11 22 0
33 44 0
ans(:,:,2) =
22 0 11
0 44 33
说明:
(m~=0)
为我们提供了逻辑索引(与m
相同的形状),这些逻辑索引确定了m
中要分配给哪些元素:
>> m~=0
ans =
ans(:,:,1) =
1 1 0
1 1 0
ans(:,:,2) =
1 0 1
0 1 1
nonzeros(m)
为我们提供了m
的非零元素,将其用作r
中的索引,其分配顺序与分配给左侧的顺序相同:>
>> nonzeros(m)
ans =
1
3
2
4
2
4
1
3