我有闪电数据,我想在循环中读取它们,对每个变量执行行索引;
row_idx = (hr == M(:, 2) & -40 <= M(:, 3) & M(:, 3) <= 0 & 135 <= M(:, 4) & M(:, 4) <= 180...
| (-180 < M(:, 4) & M(:, 4) <= -120)); filtered_M = M(row_idx, :);
其中M是一个虚拟变量,已经赋值变量,hr是小时(我已经指定为全局变量)。
变量命名为A(年)(月)(日),例如,2013年1月1日的数据为A20130101,2013年12月29日的数据为A20131229。
我的目标是读取for循环中的所有变量。当读取每个变量时,我想对它们执行行索引操作(如上所述)并存储操纵变量 例如,如果读取变量是A20130201,那么我想将操纵变量存储为filtered_A20130201。
我很难读取变量并存储生成的矩阵。
我试过了,
for k = 1:n
M = A2013010k;
row_idx = (hr == M(:, 2) & -40 <= M(:, 3) & M(:, 3) <= 0 & 135 <= M(:, 4) & M(:, 4) <= 180 ...
| (-180 < M(:, 4) & M(:, 4) <= -120));
filtered_M = M(row_idx, :);
filtered_A2013010k = filtered_M;
end
但是我意识到我的努力是徒劳的,因为我不熟悉MATLAB编码。
答案 0 :(得分:1)
您不能简单地使用数字变量来构造直接变量名称。解决方法是构造变量名称的字符串,然后调用函数eval
。
例如:
for k = 1:n
varName = ['A201401' sprintf('%02d',k)] ;
eval( ['M=' varName ] ) ;
row_idx = (hr == M(:, 2) & -40 <= M(:, 3) & M(:, 3) <= 0 & 135 <= M(:, 4) & M(:, 4) <= 180 ...
| (-180 < M(:, 4) & M(:, 4) <= -120));
filtered.(varName) = M(row_idx, :) ;
end
虽然不建议使用eval
。
为避免遇到同样的问题(必须使用eval
)来存储过滤后的变量,我将它们分配到一个结构中。 matlab结构可以有dynamic field,这意味着你可以根据字符串(易于构造或以编程方式增加)构造字段的名称。
如果您想了解更多信息,请查看this question的已接受答案。它与您的要求非常相似,答案得到了很好的解释。
答案 1 :(得分:1)
在变量序列中拥有一系列数据通常是不好的做法,就像你对A20130101
等一样。
如果无法提供帮助,您可以使用eval
作为解决方法:
for k = 1:n
eval(sprintf('M = A201301%02d', k));
row_idx = (hr == M(:, 2) & -40 <= M(:, 3) & M(:, 3) <= 0 & 135 <= M(:, 4) & M(:, 4) <= 180 ...
| (-180 < M(:, 4) & M(:, 4) <= -120));
filtered_M = M(row_idx, :);
eval(sprintf('filtered_A201301%02d = filtered_M', k));
end
有关详细信息和最佳做法,请参阅this page。