Matlab中是否有快速编写以下代码的方法:
[SmallA41./SmallA42, SmallA51./SmallA52, SmallA61./SmallA62, ..., SmallA201./SmallA202]
其中SmallA
对所有变量都是通用的,“数字”的范围从4
到20
,而SmallA__
形式的每个变量名都是{{1}矢量?
我一直在尝试101 x 1
,但不知道如何循环变量名称。
谢谢!
答案 0 :(得分:3)
可能的不完全优雅解决方案但允许不使用eval
的解决方案可能是:
.mat
文件.mat
文件中的变量读入结构虚拟.mat
可以在脚本末尾删除。
% Define the input arrays
SmallA4=randi(10,3,1);;
SmallA5=randi(10,3,1);;
SmallA6=randi(10,3,1);;
SmallA7=randi(10,3,1);;
SmallA8=randi(10,3,1);;
SmallA9=randi(10,3,1);;
SmallA10=randi(10,3,1);;
SmallA11=randi(10,3,1);;
SmallA12=randi(10,3,1);;
SmallA13=randi(10,3,1);;
Small13=randi(10,3,1);;
% Get the names of the varaibles
lv=who('SmallA*')
% Save the desired variables in a dummy ".mat" file
[pathstr,name,ext] = fileparts(tempname);
save([name '.mat'],lv{:})
% Load the varaible stored in the dummy ".mat" file in a struct
lv_s=load([name '.mat'])
% Build the target matrix by dinamically creating the names of the fields
m=[];
for i=4:2:13
m=[m,lv_s.(['SmallA' num2str(i)])./lv_s.(['SmallA' num2str(i+1)])]
end
希望这有帮助。
Qapla
答案 1 :(得分:2)
首先,你真的需要停止依赖变量名,所以我们首先将这些变量转换为一个单元格数组,其中每个元素都包含100 x 1向量。
SmallA1 = rand(100,1);
SmallA2 = rand(100,1);
SmallA3 = rand(100,1);
SmallA4 = rand(100,1);
vars = whos('SmallA*');
% Borrowing the idea from the answers below
tmp = [tempname, '.mat'];
save(tmp, vars.name);
data = load(tmp, '-mat');
indices = str2double(regexp({vars.name}, '(?<=SmallA)\d', 'match', 'once'));
A = cell(size(vars));
for k = 1:numel(vars)
A{indices(k)} = data.(vars(k).name);
end
现在A
是一个包含数据的N元素单元格数组,其中每个元素的索引对应于前一个变量名称的数字部分。
现在要做你想做的事,你可以简单地使用索引和矩阵划分。
对于我提出的简单案例,这将是
result = cat(2, A{1:2:end}) ./ cat(2, A{2:2:end});
对于您发布的确切方案,这将转换为:
result = cat(2, A{41:10:end}) ./ cat(2, A{42:10:end});
由于您的所有SmallA *值都是100x1向量,因此您可以将结果存储在100 x N数组中,其中每列代表每个变量包含的值。
A = cat(2, A{:});
然后按以下方式执行您想要的部门:
result = A(:,41:10:end) ./ A(:,42:10:end);
然后通过这些更改,您可以专注于实际数学并停止担心如何解析变量名称等。
答案 2 :(得分:0)
以下代码有效:
for kk = 4:20
y(:,kk-3) = horzcat(eval(['SmallA' num2str(kk) '1'])./eval(['SmallA' num2str(kk) '2']));
end