【问题标题】:Creating matrix names iteratively in MATLAB and performing operations在 MATLAB 中迭代地创建矩阵名称并执行操作
【发布时间】:2013-10-26 14:04:07
【问题描述】:

我有一个 3 维矩阵 K(i,j,l)。我想从 K 创建一个新矩阵,这将是 i 的每个值的一个切片。我还必须转置新形成的二维矩阵。

for l=1:40  
    for j=1:15
       K1(l,j)=K(1,j,l);
       K2(l,j)=K(2,j,l);
.
.
.
       K35(l,j)=K(35,j,l);
    end;
end;

我想创建另一个循环,其中在循环中创建新矩阵的名称。

即;

K1(l,j)=K(1,j,l) (when i=1)
K2(l,j)=K(2,j,l) when i=2...

我面临的问题是我似乎无法在循环中迭代地命名矩阵 (K1,K2...K35) 并同时执行维度更改操作。我试过num2strsprintf,但由于某种原因它们似乎不起作用。如果你们有任何想法,请告诉我。谢谢!

【问题讨论】:

  • 我在您的问题中没有看到任何文件名。对我来说不是很清楚。
  • 抱歉,可能出现了混淆。文件名是指矩阵 K1、K2、K3 等的名称。我的错。

标签: matlab matrix


【解决方案1】:

我不明白您为什么要为矩阵分配不同的名称。您不能像这样将它们存储在一个单元格中吗:

K = cell(35, 1);
for ii=1:35
  K{ii} = squeeze(K_DEA(ii, :, :))';
end

否则,如果您确实需要使用不同的名称,请执行以下操作:

K = cell(35, 1);
for ii=1:35
  eval(sprintf('K%d = squeeze(K_DEA(ii, :, :))'';', ii));
end

【讨论】:

  • squeeze 没必要。
  • 我不明白 user2923076 和 jkshah 在做什么。 1. K(1,:,:) 是一个 3D 数组,不能在 Matlab 中转置:他们说 jkshah 的代码有效,我不这么认为,在 R2010b 之前的 Matlab 版本上肯定不行。这就是为什么你需要挤压。 2. Matlab 字符串需要 '',而不是 jkshah 代码中的 ""。后者会产生错误,至少在 R2010b 之前的 Matlab 版本上是这样。 Matlab 新版本是否更新了这些功能?
  • 1.据我所知K(1,:,:)2D 矩阵而不是 3D。 2.关于语法,我一般compile online,虽然我没有在MatLab上测试过。只要对OP有效,应该没问题。
  • 尝试 K(1, :, :)' 会返回错误:«???未定义在 ND 阵列上使用 ==> ctranspose / Transpose 时出错»。这也发生在您建议的网站上(无论如何都会在 Octave 中编译)。所以我有点疑惑。
  • 糟糕,抱歉。你是真的,我的错。我可能没有测试过 3D。为了简单起见,我只是尝试了 2D 进行测试,我的错。我已将squeeze 添加到我的解决方案中。现在我很疑惑,OP是怎么接受的??!!他应该对他的真实数据进行测试
【解决方案2】:

如果我正确理解您的问题,以下应该可以解决您的问题:

K1=squeeze(K(1,:,:))';
K2=squeeze(K(2,:,:))';
.
.
.
K35=squeeze(K(35,:,:))';

用于循环i=1:35

for i=1:35
  name = sprintf("K%d",i);
  A = squeeze(K(i,:,:))';
  eval([name ' = A']);
end

或者更简洁,

for i=1:35
  eval([sprintf("K%d = squeeze(K(i,:,:))'",i)]);
end

【讨论】:

  • 我目前正在这样做,但我想知道变化的值 (1..35) 本身是否可以成为循环的一部分。也就是说,我需要在循环中更改矩阵名称。由于我必须对相当多的矩阵做同样的事情,所以行太多会有点麻烦。
  • @user2923076 请注意在我的解决方案中添加了squeeze 函数。
猜你喜欢
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
  • 2014-01-03
  • 2019-12-09
  • 2016-12-21
  • 1970-01-01
相关资源
最近更新 更多