gpt4 book ai didi

matlab - 对每行不同范围的元素求和并替换

转载 作者:行者123 更新时间:2023-12-02 05:57:30 25 4
gpt4 key购买 nike

A = [-1,-1,0,0,4,1,3,0,1,1;
-1,1,1,0,2,1,1,0,0,1;
0,0,1,0,1,0,1,0,2,0];

B = [3,5;
2,6;
1,7];

预期输出元胞数组(一列):

C = [4,4,4,4,4,4,4,4,4,4;            %// sum of elements 3,4,5 is 4
5,5,5,5,5,5,5,5,5,5; %// sum of elements 2,3,4,5,6 is 5
3,3,3,3,3,3,3,3,3,3]; %// sum of elements 1,2,3,4,5,6,7 is 3

矩阵B包括应该使用哪些列来执行矩阵A上的条件。例如,B的第一行是3和5;因此应该使用矩阵 A 第 3 列和第 5 列之间的元素来执行条件。 B的第二行是2和6;因此应使用第 2 列第 6 列之间的元素来执行条件。等等...

条件:对指定元素求和,然后用计算出的和替换相关行的所有元素。例如,A包含0,0,4(和为0+0+4=4),因此将4写入矩阵C第一行的所有元素。

没有for循环,只有矩阵运算,我该如何完成这个任务?

最佳答案

一种基于repelem的方法, @colon notation & accumarray -

id = repelem(1:size(B,1),diff(B,[],2)+1)
extents_cell = arrayfun(@colon, B(:,1), B(:,2), 'Uni', 0)

rowval = accumarray(id(:),A(sub2ind(size(A),id,[extents_cell{:}])))
C = repmat(rowval,1,size(A,2))

请注意,repelem 仅在 MATLAB 2015a 中受支持。因此,如果您无权访问它,您可以使用 this answer 中列出的自定义一个。或者像这样计算 id -

id = repelem_custom(1:size(B,1),diff(B,[],2).'+1)

替换repelem的自定义函数看起来像这样 -

function out = repelem_custom(vals,runlens)
clens = cumsum(runlens);
idx = zeros(1,(clens(end)));
idx([1 clens(1:end-1)+1]) = diff([0 vals]);
out = cumsum(idx);
return;

关于matlab - 对每行不同范围的元素求和并替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30544596/

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