gpt4 book ai didi

带有 bsxfun 的用于结束循环的 matlab 复合体

转载 作者:行者123 更新时间:2023-12-04 18:20:19 25 4
gpt4 key购买 nike

我有一个 double 的 2092x252 矩阵s 并且需要创建一个 for使用 bsxfun 的循环.对于这个例子,我们只说bsxfun(@minus) .我需要循环完成的是运行 bsxfun(@minus)使用每一列作为索引。例如,将第 1 列指定为索引会得到与第 2:252 列的差异(使用 bsxfun(@minus) )。然后将第 2 列设置为索引并获得与 3:252 列的差异(再次使用 bsxfun(@minus) )。循环必须继续运行直到 bsxfun(@minus, 251, 252) .

输出将是一个变量而不是 251 个变量。总共将有 31626 个数据点。

另外,请您解释一下代码。

最佳答案

我不确定这是否正是你想要的,因为它会产生 31626x2092 数据点,但既然你说要取列的差异......

data=ceil(rand(7,5)*10); % some sample data, works with any matrix(at least 2 columns of course)

N = size(data,2);

%b=cell(N-1,1);
c=NaN(size(data,1),N*(N-1)/2); % preallocate result matrix

kk=0;
for ii=1:N-1
%b{ii} = bsxfun(@minus,data(:,ii),data(:,ii+1:end));
c(:,kk+(1:N-ii)) = bsxfun(@minus,data(:,ii),data(:,ii+1:end));
kk=kk+N-ii;
end

这里的关键是,在每个循环步骤中,您只选择要执行 minus 的矩阵部分。操作,即: data(:,ii) (= 第 ii 列)和 data(:,ii+1:end) (= 所有剩余的列,从第 ii'th 到矩阵的末尾)

bsxfun function描述 说:
将逐元素二元运算应用于启用单例扩展的两个数组

该单例扩展是我在这里使用的,bsxfun 看到两个输入是一列和一个具有相同大小列的矩阵,并将列扩展为与矩阵相同的大小(=单例扩展(行维度得到扩展))

因此,如果您希望将行相互减去,您只需提供一行和与以前相同的矩阵,它也会知道该怎么做,即沿列维度扩展行向量:
N = size(data,1);

%b=cell(N-1,1);
c=NaN(N*(N-1)/2,size(data,2)); % preallocate result matrix

kk=0;
for ii=1:N-1
%b{ii} = bsxfun(@minus,data(ii,:),data(ii+1:end,:));
c(kk+(1:N-ii),:) = bsxfun(@minus,data(ii,:),data(ii+1:end,:));
kk=kk+N-ii;
end

如您所见,所有矩阵的索引交换了位置: A(i,j)改为 A(j,i) .

在循环的每个步骤中使用单元格作为结果矩阵可以更轻松地访问结果,但是由于您希望将结果放在一个变量中(我假设是矩阵),所以我将它们注释掉了。

编辑

预分配: http://www.mathworks.nl/help/techdoc/matlab_prog/f8-784135.html
c(:,kk+(1:N-ii));
kk=kk+N-ii

是索引,这是最棘手的:
当 ii=1 时,您有 251 列要插入:这将是输出变量中的第 1-> 251 列
ii=2 -> 250 列,输出中的第 252->501 列
ii=3 -> 249 列,输出中的第 502->750 列
ii=4 => 248 列,输出中的列 751->999
等等
kk+(1:N-ii)本质上是这样做的:为 bsxfun 的输出选择适当的列.
变量 kk是已保存到输出变量 c 中的列数,所以很明显它从零开始。如果将其更改为另一个值,例如 kk_init , 第一个 kk_init c 的列将保持为空,结果 c矩阵将有 N*(N-1)/2+kk_init列而不是 N*(N-1)/2 .

关于带有 bsxfun 的用于结束循环的 matlab 复合体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10831122/

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