如果一个维度是单个维度,则文件中的变量维度与索引下标的维度不匹配

时间:2013-10-25 16:40:02

标签: arrays matlab file-io multidimensional-array dimensions

我希望使用参数func(par1,par2,par3)par1par2的所有组合测试函数par3,并将输出存储在.mat文件中。我的代码目前看起来像这样:

n1 = 3;
n2 = 1;
n3 = 2;

parList1 = rand(1,n1);    % n1,n2,n3 is just some integer
parList2 = rand(1,n2);    % the lists are edited by hand in the actual script
parList3 = rand(1,n3);

saveFile = matfile('file.mat','Writable',true);
% allocate memory    
saveFile.output = NaN(numel(parList1),numel(parList2),numel(parList3));  

counter1 = 0;
for par1 = parList1
    counter1 = counter1 + 1;
    counter2 = 0;    % reset inner counter
   for par2 = parList2
     counter2 = counter2 + 1;
     counter3 = 0;   % reset inner counter
      for par3 = parList3
         counter3 = counter3 + 1;
         saveFile.output(counter1,counter2,counter3) = sum([par1,par2,par3]);
      end
   end
end

除非parList3只有一个项目,例如n3 = 1,否则此方法有效。然后saveFile.output有单例尺寸,我得到错误

Variable 'output' has 2 dimensions in the file, this does not match the 3 dimensions in the indexing subscripts.

有没有一种优雅的方法来解决这个问题?

2 个答案:

答案 0 :(得分:1)

for语句中的表达式需要是行数组,而不是示例中的列数组。循环将在代码的第一个值之后退出。在saveFile.output命令上设置断点以查看我的意思。 使用列数组par1不会是所需的标量,而是整个parList1列。 使用行数组par1将按预期迭代parList1的每个值

另一件事是你需要重置你的内部计数器counter2counter2),否则你的第二和第三维度会比你想象的要大。

n3=1问题是预期的行为,因为matfile定义了具有固定维数的变量,并将saveFile.output视为2D。修复这些问题后,您可以通过更改行来解决n3=1问题,

saveFile.output(counter1,counter2,counter3) = sum([par1,par2,par3]);

if n3==1, saveFile.output(counter1,counter2) = sum([par1,par2,par3]);
else saveFile.output(counter1,counter2,counter3) = sum([par1,par2,par3]);
end

答案 1 :(得分:0)

到目前为止,我意识到实际上在matfiles中,所有单例维度除了前两个都被删除了。

在我的实际程序中,我决定将数据线性保存在文件中,并通过使用函数sub2indind2sub来避免matfile缺乏线性索引功能。