根据第一列中的标签将第二列中的元素相乘
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];
您可以使用 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 博客 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]
我在 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];
您可以使用 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 博客 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]