有关逻辑索引和cell2struct函数的MATLAB问题

时间:2015-03-15 08:32:52

标签: matlab indexing logical-operators

第一个问题: 你好!

我正在尝试分配此向量

  

v(mod(v,2)~=0)=0

操作应该用0替换向量中的奇数。我试图将此向量分配给函数中的结果变量。

当我尝试这个时出现问题  功能

 function [result1,result2] = myfunction(v)
 v(mod(v,2)==0)= 0; 
result1 = v;

v(mod(v,2)~=0) = 0; 
result2 = v; 
return

问题2:

我试图想出一种以for循环格式表达函数cell2struct的替代方法

例如,

如果我们有一个包含食物标签的2维单元格数组。他们的名字,卡路里数和价格,每一列。我们是否可以编写一个函数,可以将单元格中的信息传递给包含上述每个字段的结构?

由于

1 个答案:

答案 0 :(得分:1)

问题#1

您正在将所有偶数设置为0,但是您使用此突变结果来搜索奇数并将它们设置为0.这可能无法提供您的预期使用原始向量的修改副本,因此在执行每个操作之前保留向量的副本是明智的。

function [result1,result2] = myfunction(v)
vcopy = v; %// Make a copy
vcopy(mod(vcopy,2)==0)= 0; %// Find even numbers and set to 0 
result1 = vcopy;

vcopy = v; %// Make another copy
vcopy(mod(vcopy,2)~=0) = 0; %// Find odd numbers and set them to 0.
result2 = vcopy; 
return

问题#2

烨。如果您有f中存储的字段名称列表及c中存储的每个字段的相应实体,只需使用如下循环:

function [s] = my_cell2struct(c, f)
for idx = 1 : numel(f)
    s.(f{idx}) = c{idx};
end

上述代码没有进行错误检查,因此您需要确保c中的元素总数与f的元素总数相匹配。此外,cf必须是单元格数组。请注意,函数中根本没有声明s。此外,使用点运算符结合括号和包含在括号内的字符串,可以动态创建字段名称。因此,对于f中的每个字符串,我们访问c中存储的相应值,并创建包含此值的字段名称。

以下是MathWorks文档中可重现的示例:

c = {'tree',37.4,'birch'};
f = {'category','height','name'};
s = cell2struct(c, f, 2)

s = 

    category: 'tree'
      height: 37.4000
        name: 'birch'

请注意,我在本地MATLAB中使用cell2struct来生成上述结构。执行包含在名为for的函数中的上述my_cell2struct循环,我们得到:

c = {'tree',37.4,'birch'};
f = {'category','height','name'};
s =  my_cell2struct(c, f)

s = 

    category: 'tree'
      height: 37.4000
        name: 'birch'