矢量长度比较,其名称存储在单元格中

时间:2017-08-14 19:01:45

标签: matlab

工作区中有向量具有不同的向量长度。我有一个包含矢量名称的字符串单元格。我想用cellfun来吐出这些载体的长度。

例如,

t1 = 1x10 double
t2 = 1x100 double
t3 = 1x20 double
cel = {'t1','t2','t3'};

cellfun(@(c) eval(['length(',c{:},')']),cel)

我认为做以下工作会完成这项工作,但事实并非如此。我有理由为什么我需要使用cellfun和eval来解决这个问题。

有人可以指出什么是错的吗?我收到的错误消息是:

cellfun(@(c) eval(['length(',c{:},')']),cel)
Cell contents reference from a non-cell array object.

cellfun(@(c) eval(['length(',c(:),')']),cel)
Error using horzcat
Dimensions of matrices being concatenated are not consistent.

cellfun(@(c) eval(['length(',[c{:}],')']),yvar)
Cell contents reference from a non-cell array object.

取决于我尝试的变化。

或更好。最终目标是检查所有向量的长度是否相同。如果有办法在没有循环的情况下这样做,那就太好了。

2 个答案:

答案 0 :(得分:2)

  

我有理由说明为什么我需要使用ng servecellfun来解决此问题。

这个问题以及肯定会遵循的问题是使用eval的绝妙理由。永远。从来没有。它很难调试,它很慢(eval语句被MATLAB的JIT编译器忽略了),它使得它变得比它需要的更复杂。

如果你绝对,完全,严重无法避免使用eval(很少存在的情况),你可以使用whos的可选输出拼凑一些东西:

例如:

eval

返回匹配变量大小的单元格数组,您可以使用它来进行所需的任何进一步分析。

如果你知道你的数据只是二维的,你可以将大小信息放到一个数组中,reshape将它放到一个可以直观解析的东西上:

t1 = rand(1, 10);
t2 = rand(1, 100);
t3 = rand(1, 20);
t4 = rand(1, 1, 20);
cel = {'t1', 't2', 't3', 't4'};

ws = whos();
tmp = {ws.name};
sizes = {ws(ismember(tmp, cel)).size}

t1 = rand(1, 10); t2 = rand(1, 100); t3 = rand(1, 20); cel = {'t1', 't2', 't3'}; ws = whos(); tmp = {ws.name}; sizes = reshape([ws(ismember(tmp, cel)).size], 2, []).'; 还支持regular expressions,它允许您根据模式匹配变量,而不必填充单元格数组:

whos

答案 1 :(得分:0)

您可以使用whos

<div id="header-image">
  <div class="image">
    <div class="header-title">The quick brown fox jumped over the lazy dog</div>
    <img src="http://via.placeholder.com/480x683.png" width="100%" class="screen-
    480" alt="img" />
    <img src="http://via.placeholder.com/1028x550.png" width="100%" class="screen-
    768" alt="img" />
  </div>
  <div class="bottom-bar"></div>
</div>
 

我同意这个评论。重写代码,这样您就不需要奇怪的解决方法。