我的问题很容易归纳为:"为什么以下不起作用?"
teststruct = struct('a',3,'b',5,'c',9)
fields = fieldnames(teststruct)
for i=1:numel(fields)
fields(i)
teststruct.(fields(i))
end
Run Code Online (Sandbox Code Playgroud)
输出:
ans = 'a'
??? Argument to dynamic structure reference must evaluate to a valid field name.
Run Code Online (Sandbox Code Playgroud)
特别是因为teststruct.('a') 确实有效.并fields(i)打印出来ans = 'a'.
我无法理解它.
我有一个具有许多字段的结构,这些字段是不同长度的向量.我想按顺序访问循环中的字段.我试过getfield如下,但MATLAB不喜欢这样.我怎样才能做到这一点?
S = struct('A', [1 2], 'B',[3 4 5]);
SNames = fieldnames(S);
for loopIndex = 1:2
field = getfield(S, SNames(loopIndex));
%do stuff w/ field
end
??? Index exceeds matrix dimensions
Run Code Online (Sandbox Code Playgroud)
我首先使用结构,因为数组会遇到不同字段长度的问题.还有更好的选择吗?
我正在使用MATLAB中使用颜色直方图交集的图像检索系统.此方法为我提供以下数据:表示直方图交叉距离的实数和图像文件名.因为它们是不同的数据类型,我将它们存储在具有两个字段的结构数组中,然后我将此结构保存在.mat文件中.现在我需要根据直方图交叉距离按降序对此结构进行排序,以便检索具有最高直方图交叉距离的图像.我已经尝试了很多方法来对这些数据进行排序但没有结果.请问你能帮我解决这个问题吗?
首先,我指定A为结构和其他两个结构:B具有相同的元素顺序,并C具有不同的元素顺序.
A.x = 11;
A.y = 11;
B.x = 21;
B.y = 22;
C.y = 31; %// Note that I am specifying
C.x = 32; %// y first and x second
A = B; %// Works fine
A = C; %// Works fine
Run Code Online (Sandbox Code Playgroud)
分配A给B和C工作,这是我对结构的期望 - 元素的顺序无关紧要.
现在,我指定A为结构数组,而不是一个结构,并试图转让其要素之一B,并C分别为:
clear;
A(1).x = 11;
A(1).y = 12;
B.x = 21;
B.y = 22;
C.y = …Run Code Online (Sandbox Code Playgroud) 我想从字符串中删除连字符(-),斜杠(/)和空格() from a string name(i)以便我可以将其用作结构字段名称.
这是我目前正在使用该功能的丑陋方式strrep:
cell2mat(strrep(strrep(strrep(name(i), '-',''),'/',''),' ', ''))
Run Code Online (Sandbox Code Playgroud)
我也尝试了其他变体,例如:
strrep(name(i),{'-','/'},{'',''});
strrep(name(i),['-','/'],['','']);
Run Code Online (Sandbox Code Playgroud)
什么是更有效的方法呢?
我不知道这里发生了什么.我正在使用R2006b.在我提交错误报告之前,任何有新版本的人都可以测试他们是否得到相同的行为?
代码:( bug1.m)
function bug1
S = struct('nothing',{},'something',{});
add_something(S, 'boing'); % does what I expect
add_something(S.something,'test'); % weird behavior
end
function add_something(X,str)
disp('X=');
disp(X);
disp('str=');
disp(str);
end
Run Code Online (Sandbox Code Playgroud)
输出:
>> bug1
X=
str=
boing
X=
test
str=
??? Input argument "str" is undefined.
Error in ==> bug1>add_something at 11
disp(str);
Error in ==> bug1 at 4
add_something(S.something,'test');
Run Code Online (Sandbox Code Playgroud)
看起来像空虚/虚无S.something允许它移动函数调用的参数.这看起来像非常糟糕的行为.在短期内我想找到它周围(我正在尝试创建一个函数,将项添加到最初为空的单元格数组,该数组是结构的成员).
编辑:
推论问:所以没有办法构造一个struct包含任何空单元格数组的文字?
a= struct('a1',{1,2,3},'a2',{4,5,6})
怎么能得到1的值;
我尝试使用返回错误的a.a1 {1}
>> a.a1{1}
??? Field reference for multiple structure elements that is followed by more reference blocks is an
error.
Run Code Online (Sandbox Code Playgroud)
我如何访问1?谢谢.
编辑
A = struct{'a1',[1 2 3],'a2',[4 5 6]}
我如何访问1.我使用,A(1).a1但我得到1 2 3
我的问题是:if S和empty 之间有什么区别.S(:)S
我认为由于这个问题存在差异: 将字段添加到空结构中
最小的说明性示例:
S = struct(); %Create a struct
S(1) = []; %Make it empty
[S(:).a] = deal(0); %Works
[S.b] = deal(0); %Gives an error
Run Code Online (Sandbox Code Playgroud)
给出的错误:
当结构为空时,点名结构分配是非法的.在结构上使用下标.
我有一个8x18结构,每个cel包含一个单个事件发生的列向量.我想从单个数组中连接的一些字段中获取数据,而不必循环遍历它.我似乎找不到一种方法来垂直连接我感兴趣的字段在一个数组中.
作为一个例子,我创建了以下结构,每个单元格出现1到5次:
s(62).vector(8,18).heading.occurrences=[1;2;3];
for i=1:62
for j=1:8
for k=1:18
y=ceil(rand(1)*5);
s(i).vector(j,k).heading.occurrences=rand(y,1);
end
end
end
Run Code Online (Sandbox Code Playgroud)
现在,如果想要获得几个单元格中的所有实例,同时保持i常量,i=1以下工作:
ss=s(1).vector([1 26 45]);
h=[ss.heading];
cell2mat({h.occurrences}')
Run Code Online (Sandbox Code Playgroud)
现在我想做同样的事情s,例如s([1 2 3]).vector([1 26 45]),它将如何工作?我试过了xx=s([1 2 3]),yy=xx.vector([1 26 45])但是这会产生错误:
期望从大括号或点索引表达式输出一个,但有3个结果.
矢量操作也可以吗?
直到最近,我一直将时间序列数据存储struct在MATLAB中,方法是将索引放在字段名后面,例如:
Structure.fieldA(1) = 23423
Run Code Online (Sandbox Code Playgroud)
因此,struct有一组字段,每个字段都是一个向量.
我已经看到很多其他程序使用不同的格式,其中结构本身被索引,并且结构的每个索引包含一组字段,例如:
Structure(1).fieldA
Run Code Online (Sandbox Code Playgroud)
哪种方法最有效?我应该坚持使用top选项还是应该使用bottom方法切换我的程序?
matlab ×10
matlab-struct ×10
arrays ×2
struct ×2
cell-array ×1
field ×1
indexing ×1
sorting ×1
string ×1