0

我想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

这有效,除非 ifparList3只有一项,即 if n3 = 1。然后saveFile.output有单身维度,我得到了错误

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

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

4

2 回答 2

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
于 2013-10-25T20:26:31.967 回答
0

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

在我的实际程序中,我决定将数据线性保存在文件中,并通过使用函数sub2indind2sub.

于 2013-11-01T14:17:09.283 回答