我有一个名为'simulatedReturnsEVT3'的三维矢量。在该向量中,我想替换所有高于'MaxAcceptableVal'或低于'MinAcceptableVal'的值。超出这两个阈值之一的此类值应替换为从三维矢量“data2”中提取的随机数。为了绘制该随机数,我使用matlab函数'datasample'。
我编写了以下代码,该代码使用从'data2'中抽样的随机数替换超出任一阈值的值。然而,似乎(当在直方图中绘制数据时)替换发生沿着维度'j'的相同值。这不是我想要做的。对于每个阈值超出,我想要从'data2'中抽取一个新的随机数来替换。
nIndices = 19
nTrials = 10000
% data2 has dimensions 782 x 19 x 10000
% simulatedReturnsEVT3 has dimensions 312 x 19 x 10000
% MaxAcceptableVal has dimensions 1 x 19
% MinAcceptableVal has dimensions 1 x 19
% Cut off Outliers
for i=1:nIndices
for j=1:nTrials
sliceEVT = simulatedReturnsEVT3(:,i,j);
sliceEVT(sliceEVT < MinAcceptableVal(i))=datasample (data2(:,i,j), 1,1,'Replace',false);
sliceEVT(sliceEVT > MaxAcceptableVal(i))=datasample (data2(:,i,j), 1,1,'Replace',false);
simulatedReturnsEVT3(:,i,j) = sliceEVT;
end
end
通过创建以下矩阵,可以在较小的范围内说明同样的问题。
% Set Maximum Acceptable Levels for Positive and Negative Returns
MaxAcceptableVal = [0.5 0.3]
MinAcceptableVal = [-0.5 -0.3]
simulatedReturnsEVT3 = [0.6 0.3; 0.3 0.3; 0.3 0.3; 0.3 0.4]
simulatedReturnsEVT3 = repmat(simulatedReturnsEVT3,[1 1 2])
data2 = [0.25 0.15; 0.25 0.15; 0.2 0.1]
data2 = repmat(data2,[1 1 2])
% Cut off Outliers
for i=1:2
for j=1:2
sliceEVT = simulatedReturnsEVT3(:,i,j);
sliceEVT(sliceEVT < MinAcceptableVal(i))=datasample (data2(:,i,j), 1,1,'Replace',false);
sliceEVT(sliceEVT > MaxAcceptableVal(i))=datasample (data2(:,i,j), 1,1,'Replace',false);
simulatedReturnsEVT3(:,i,j) = sliceEVT;
end
end
有人可以帮忙吗?
答案 0 :(得分:1)
如果我已经理解了这个问题,那么它似乎与datasample
的使用有关。
在您的代码中使用:
datasample (data2(:,i,j), 1,1,'Replace',false);
在此次通话中,第一个&#34; 1
&#34;定义要提取的样本数量为&#34; 1
&#34;。
如果必须在simulatedReturnsEVT3
矩阵中替换多个值,则所有值都将被使用datasample
提取的相同唯一数字替换
同样,如果我已经理解了这个问题,您应该通过指定数字&#34; datasample
&#34;来呼叫n
。需要使用值来替换绑定的&#34; simulatedReturnsEVT3
datasample (data2(:,i,:), n,1,'Replace',false)
为了测试这个解决方案,我修改了MaxAcceptableVal
的定义,以便更多地使用&#34;更多&#34;价值观&#34;超出界限&#34;在simulatedReturnsEVT3
:
MaxAcceptableVal = [0.5 0.2]
这些是替换前simulatedReturnsEVT3
的值:
val(:,:,1) =
0.6000 0.3000
0.3000 0.3000
0.3000 0.3000
0.3000 0.4000
val(:,:,2) =
0.6000 0.3000
0.3000 0.3000
0.3000 0.3000
0.3000 0.4000
这些是替换后的值:
val(:,:,1) =
0.2500 0.1500
0.3000 0.1000
0.3000 0.1500
0.3000 0.1000
val(:,:,2) =
0.2000 0.1000
0.3000 0.1500
0.3000 0.1500
0.3000 0.1000
这是更新的代码:
% Set Maximum Acceptable Levels for Positive and Negative Returns
% MaxAcceptableVal = [0.5 0.3]
MaxAcceptableVal = [0.5 0.2]
MinAcceptableVal = [-0.5 -0.3]
simulatedReturnsEVT3 = [0.6 0.3; 0.3 0.3; 0.3 0.3; 0.3 0.4]
simulatedReturnsEVT3 = repmat(simulatedReturnsEVT3,[1 1 2])
data2 = [0.2 0.1; 0.25 0.15; 0.25 0.15; 0.2 0.1]
data2 = repmat(data2,[1 1 2])
% Cut off Outliers
for i=1:2
for j=1:2
sliceEVT = simulatedReturnsEVT3(:,i,j)
% Identify the index of the values to be replaced
idx=find(sliceEVT < MinAcceptableVal(i))
% Evaluate how many values have to be replaced
n=length(idx)
% Extract and assign the number from "data2"
sliceEVT(idx)=datasample (data2(:,i,j), n,1,'Replace',false)
% Identify the index of the values to be replaced
idx=find(sliceEVT > MaxAcceptableVal(i))
% Evaluate how many values have to be replaced
n=length(idx)
% Extract and assign the number from "data2"
sliceEVT(idx)=datasample (data2(:,i,j), n,1,'Replace',false)
simulatedReturnsEVT3(:,i,j) = sliceEVT
end
end
希望这有帮助。