工作区中有向量具有不同的向量长度。我有一个包含矢量名称的字符串单元格。我想用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.
取决于我尝试的变化。
或更好。最终目标是检查所有向量的长度是否相同。如果有办法在没有循环的情况下这样做,那就太好了。
答案 0 :(得分:2)
我有理由说明为什么我需要使用
ng serve
和cellfun
来解决此问题。
这个问题以及肯定会遵循的问题是不使用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>
我同意这个评论。重写代码,这样您就不需要奇怪的解决方法。