【问题标题】:Matlab: column of empty matrixMatlab:空矩阵的列
【发布时间】:2013-09-06 22:08:30
【问题描述】:

想知道是否有人可以帮助我。

为了获取矩阵 A 的第一列 x。我使用 x = A(:,1)。每隔一段时间,矩阵 A 是空的,在这种情况下,我希望我的列也是空的。但是在 Matlab 中,代码退出时出现错误“索引超出矩阵维度”。有没有办法阻止它退出,而是给我[]?

(我当然可以使用 isempty(A) 写一个“if”语句,但这很烦人,因为我的代码中有几十个地方可能有空矩阵。)

【问题讨论】:

  • 也许您可以使用元胞数组,这样您就可以拥有:A{1} = []A{1} = rand(10,1),并始终以:x = A{1} 的形式访问它

标签: matlab matrix matrix-indexing


【解决方案1】:

这有点笨拙,但它有效并且比iftry 短:

A(:,1:min(1,size(A,2)))

A(:,1:9999999999:size(A,2))

【讨论】:

  • 为什么投反对票?这是完全有效的,而且是一个聪明的把戏。第一个可以变得更友好:A(:,1:min(1,end))。第二个相同:A(:,1:end+1:end)。我仍然不会在我的代码中使用它:)
  • @Amro 哇,我从来不知道你可以使用 end 作为这样的函数参数。
  • @BasSwinckels:这是因为您还可以为用户定义的类重载end 方法并自定义对象的索引行为:mathworks.com/help/matlab/matlab_oop/…
  • @Amro:实际上,我认为这只是因为 end 在第二个下标中使用,所以 MATLAB 知道您在谈论 size(A,2)min 不是数组,所以 end 不能表示 min 的大小。
  • @BenVoigt:我明白,我只是提供了我认为相关的文档链接 :) 如果您想要更奇怪的行为,请尝试:A(:,min(1,end))f = @min; A(:,f(1,end))。解析器在这里错误地解释了end 语句,认为f 是一个要索引的数组,即使它是一个函数句柄。如果你想看看发生了什么,在当前目录中创建一个名为end.m 的文件覆盖内置函数:function ind = end(o,k,n), keyboard, ind = builtin('end',o,k,n); end
【解决方案2】:

您可以使用逻辑索引:

A(:,end>0);

对于非空矩阵,它将是

A(:,logical(1));

返回第一列,对于空矩阵,它将是

A(:,logical(0));

返回一个空列矩阵。

【讨论】:

  • 逻辑索引是否必须与被索引的数组维度的大小相同?它似乎工作虽然
  • @BenVoigt 不,它不存在,只有被选择的列应该存在。因此,对于 2×2 矩阵,可以使用 A(:, logical([0 1 0]),但不能使用 A(:, logical([0 0 1])
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 2015-02-23
  • 1970-01-01
相关资源
最近更新 更多