gpt4 book ai didi

matlab - 如何计算矩阵中每列值的编号

转载 作者:行者123 更新时间:2023-12-04 18:16:23 27 4
gpt4 key购买 nike

我有矩阵 A:

A= [ 1 1 0 2 2 2 2 0 0 3 3 0 0;
0 1 1 0 0 2 2 2 2 3 3 0 0 ];

我想制作另一个矩阵B,以便这个矩阵包含原始矩阵A的值出现次数:即每个 iiB 行包含多少次 ii出现在 A 的相应列中。数字 0 可以忽略。

例如:在 A 的第 2 列中,只有数字 1 出现,具体两次 --> 因此 B(1,2) = 2 和 B(other,2) = 0。

对于我的示例矩阵 A,输出应该是
Res = [ 1 2 1 0 0 0 0 0 0 0 0 0 0;
0 0 0 1 1 2 2 1 1 0 0 0 0;
0 0 0 0 0 0 0 0 0 2 2 0 0 ];

最佳答案

这也是 ( under-appreciated ) accumarray 的机会

A= [ 1 1 0 2 2 2 2 0 0 3 3 0 0;
0 1 1 0 0 2 2 2 2 3 3 0 0 ];
N = size(A,2);
result = zeros(max(A(:)),N);

for ii=1:N
s = accumarray(nonzeros(A(:,ii)),1);
result(1:numel(s),ii) = s;
end

太糟糕了,只有 accumarray 不能一次性完成所有操作:(

编辑

一次 accumarray 调用就搞定了::p
A= [ 1 1 0 2 2 2 2 0 0 3 3 0 0;
0 1 1 0 0 2 2 2 2 3 3 0 0 ];
N = size(A);
C = repmat(1:N(2),N(1),1);

result = accumarray([A(:)+1 C(:)], 1);
result = result(2:end,:)

编辑2

如果您有一个 3 维输入矩阵,最简单的方法是先将其转换为 2 维矩阵,然后使用上述方法对其进行处理。以下代码执行此转换:
% example data:
A3d = repmat(A,[1 1 2])
A2d = reshape(permute(A3d,[1 3 2]),[],size(A3d,2))

结果:
A3d(:,:,1) =
1 1 0 2 2 2 2 0 0 3 3 0 0
0 1 1 0 0 2 2 2 2 3 3 0 0
A3d(:,:,2) =
1 1 0 2 2 2 2 0 0 3 3 0 0
0 1 1 0 0 2 2 2 2 3 3 0 0


A2d =
1 1 0 2 2 2 2 0 0 3 3 0 0
0 1 1 0 0 2 2 2 2 3 3 0 0
1 1 0 2 2 2 2 0 0 3 3 0 0
0 1 1 0 0 2 2 2 2 3 3 0 0

关于matlab - 如何计算矩阵中每列值的编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11608394/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com