水平连接由类似变量名称表示的列向量

时间:2016-02-23 19:14:45

标签: matlab loops

Matlab中是否有快速编写以下代码的方法:

[SmallA41./SmallA42, SmallA51./SmallA52, SmallA61./SmallA62, ..., SmallA201./SmallA202]

其中SmallA对所有变量都是通用的,“数字”的范围从420,而SmallA__形式的每个变量名都是{{1}矢量?

我一直在尝试101 x 1,但不知道如何循环变量名称。

谢谢!

3 个答案:

答案 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