我在Matlab工作。 我有一个有两列的二维矩阵。让我们将第一列中的元素视为标签。标签可以重复。
如何将每个标签的第二列中的所有元素相乘?
示例:
matrix = [1,3,3,1,5; 2,3,7,8,3]'
我需要得到:
a = [1,3,5; 16,21,3]'
你可以帮我做没有 for-while
周期吗?
答案 0 :(得分:7)
我会使用accumarray
。使用unique
的预处理将整数索引1:n分配给第一行中的值,这允许accumarray
工作而不为2和4创建不必要的容器。它还支持负数和浮点数
[ulable,~,uindex]=unique(matrix(:,1))
r=accumarray(uindex,matrix(:,2),[],@prod)
r=[ulable,r]
答案 1 :(得分:4)
您可以使用accumarray和prod
函数执行此操作:
clear
clc
matrix = [1,3,3,1,5; 2,3,7,8,3]';
A = unique(matrix,'rows');
group = A(:,1);
data = A(:,2);
indices = [group ones(size(group))];
prods = accumarray(indices, data,[],@prod); %// As mentionned by @Daniel. My previous answer had a function handle but there is no need for that here since prod is already defined in Matlab.
a = nonzeros(prods)
Out = [unique(group) a]
Out =
1 16
3 21
5 3
检查Lauren博客的帖子here,accumarray是非常有趣和强大的!
答案 2 :(得分:1)
尝试这样的事情,我相信它可以改进......
unValues = unique(matrix(:,1));
bb = ones(size(unValues));
for ii = 1:length(unValues)
bb(ii) = bb(ii)*prod(matrix(matrix(:, 1) == unValues(ii), 2));
end
a = [unValues bb];