根据第一列中的标签将第二列中的元素相乘

时间:2015-01-05 15:55:51

标签: arrays matlab matrix

我在Matlab工作。 我有一个有两列的二维矩阵。让我们将第一列中的元素视为标签。标签可以重复。

如何将每个标签的第二列中的所有元素相乘?

示例:

matrix = [1,3,3,1,5; 2,3,7,8,3]'

我需要得到:

a = [1,3,5; 16,21,3]'

你可以帮我做没有 for-while周期吗?

3 个答案:

答案 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)

您可以使用accumarrayprod函数执行此操作:

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];