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

Multiply elements in second column according to labels in the first

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

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

示例:

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

我需要得到:

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

你能帮我做吗没有for-while个周期?

尝试这样的事情,我相信它可以得到改进...

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

您可以使用 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 博客 post here,accumarray 非常有趣且功能强大!

我会使用 accumarray。使用 unique 的预处理将整数索引 1:n 分配给第一行中的值,这允许 accumarray 在不为 2 和 4 创建不必要的 bin 的情况下工作。它还支持负数和浮动。

[ulable,~,uindex]=unique(matrix(:,1))
r=accumarray(uindex,matrix(:,2),[],@prod)
r=[ulable,r]

/你也可以使用splitapply:

[ulable,~,uindex]=unique(matrix(:,1))
r=splitapply(@prod,matrix(:,2),uindex)
r=[ulable,r]