这是一个简单的问题,我看不到更好的答案,也许其他人可以!这是代码:
示例变量
nSim = 3000;
nRow = 10000;
data = zeros(1, 5, nRow);
data (:, 1:4, :) = rand(4, nRow)*0.5; % 4 columns of duration values
data (:, 5, :) = 1000; % 1 column of actual value
basis.increaseRate = 1 + (rand(nSim, 4)*0.1);
示例计算
dataWithSim = repmat(data(:, 1:4,:),nSim, 1, 1);
increaseFactors = bsxfun(@power, basis.increaseRate, dataWithSim);
Values = bsxfun(@times, data(:,5,:), prod(increaseFactors,2));
需要重新包装感觉不对,但我看不到避免的方法。
实际上,我在增加^数据,我真的不想在两个维度(sims
或data
行)之间循环。伪数据可以按我选择的任何方式排序,但输出的值需要是nSim
乘nRow
矩阵。
欢迎任何想法。谢谢
您实际上不需要使用repmat
。你可以直接从data
中输入"子矩阵",就像这样-
increaseFactors = bsxfun(@power, basis.increaseRate, data(:,1:4,:));
bsxfun
在内部负责singleton
维度的扩展,在这种情况下,这是data
的第一个维度(行)。由于basis.increaseRate
具有nSim
行,而data(:,1,4,:)
具有一行,因此它将被扩展为具有相同数量的行,即nSim
,从而在内部完成重新映射/扩展的工作。
其余代码保持不变。