【问题标题】:Simplify the code to flatten arrays in matlab简化代码以在matlab中展平数组
【发布时间】:2019-01-06 04:55:43
【问题描述】:

假设我有一个 1000x2x10x10 的矩阵,目前我通过以下代码将它们放入两个元胞数组中,

  for i=1:1000
    tmp = seqs(i,1,:);
    patterns{i} = tmp(:);
    tmp = seqs(i,2,:);
    labels{i} = tmp(:);
  end

patterns{i} = tmp(:)labels{i} = tmp(:) 的目的是为了展平矩阵。我的问题是,是否可以像patterns{i}=seqs(i,1,:)(:) 这样简化代码?我试过这个,但 Matlab 不允许这样做,这就是为什么我目前必须使用临时变量 tmp

【问题讨论】:

  • 您可以使用patterns{i}=reshape(seqs(i,1,:),[],1);(:) 那样重塑为一列。此外,您的代码可能可以使用mat2cell 进行简化,但我不确定 sn-p 在做什么。也许发布一个具有所需输入和输出的最小示例
  • 我的计算机上通常有一个名为vec 的单独函数来执行此操作。要回答您的问题,如果不通过一些函数(例如 reshape 或诸如此类)在 Matlab 中进行另一个内存调用,就无法做到这一点。

标签: matlab matrix


【解决方案1】:

我只会给你 3 种方法来做到这一点。所有这些都有效。

第一个是我通常使用的,是在我的电脑上有一个叫做vec的函数

function out = vec(in)
out = in(:);
end

然后你就可以通过

来使用了
patterns{i} = vec(seqs(i,1,:));

然后你可以调用这个函数,它允许更精简的代码。第二个是cmets中提到的reshape

patterns{i}=reshape(seqs(i,1,:),[],1);

我通常不建议对这些类型的问题进行 reshape,因为如果您不小心,它往往会失败。最后是使用挤压和转置。

patterns{i} = squeeze(seqs(i,1,:))';

就个人而言,我更喜欢第一个,因为它使我的代码看起来更好。

【讨论】:

  • 或者你在需要vec之前在程序中的某个地方做vec = @(in) in(:);。那么你就不需要单独的文件了。
  • 我通常不建议对这些类型的问题进行 reshape,因为如果你不小心,它往往会失败 你是什么意思? reshape(...,[],1) 什么时候失败?
  • 另外,请注意' 转置和共轭
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多