【发布时间】:2017-10-22 09:19:49
【问题描述】:
所以,我是 Matlab 的初学者,在我的任务中需要一些帮助,因为我被困在这里! 基本上我有很多 Matlab 文件,它们使用不同的变量执行相同的功能,我需要将它们与一个函数组合在一个 Matlab 文件中,并保存这些不同的值以便稍后遍历它们并将它们传递给函数!
我一直在寻找适合保存变量的数据类型,最后我得到了结构体,所以我的结构体看起来像:
W = struct('Band7', {7, 1099, 236, 260, 236, 260, 0},
'Band2', {2, 1078, 236, 300, 236, 300, 0},
'Band3', {3, 1829, 236, 100, 236, 100, 0},
'Band4', {4, 1367, 206, 500, 206, 500, 0},
'Band1', {1, 1123, 246, 170, 246, 170, 0}, ...);
我的问题是:如何遍历结构中的每个波段以将其传递给这样的函数 -> RX_combined(W.Band4) 以及如何遍历函数本身内部的每个波段的值?!
根据 Wolfie 的回答,我将代码更新为:
function main
% create a struct with the different vars
W = struct('Band7', {7, 1099, 236, 260, 236, 260, 0},
'Band2', {2, 1078, 236, 300, 236, 300, 0},
'Band3', {3, 1829, 236, 100, 236, 100, 0},
'Band4', {4, 1367, 206, 500, 206, 500, 0},
'Band1', {1, 1123, 246, 170, 246, 170, 0});
fields = fieldnames(W)
% iterate over all bands and pass them to the function.
for i=1:numel(fields)
fields(i)
RX_combined(W.(fields{i}))
end
end
我的问题是如何访问函数内每个波段的值?!
经过一些搜索和研究后,我发现 Matlab 假设我将数组的单元分布在结构数组元素中,而不是使用每个单元数组作为我想要的单元!指的是这个answer。
为此,我通过向每个元胞数组添加另一个花括号来解决问题!
现在我的代码是:
function main
% create a struct with the different values of the RX bands to merge the files in one!
W = struct('Band7',{{7, 1099, 236, 260, 236, 260, 0}},'Band2',{{2, 1078, 236, 300, 236, 300, 0}},'Band3',{{3, 1829, 236, 100, 236, 100, 0}},'Band4',{{4, 1367, 206, 500, 206, 500,0}},'Band1',{{4, 1367, 206, 500, 206, 500,0}});
fields = fieldnames(W);
% iterate over all the bands and pass them to the function.
for i=1:numel(fields)
fields(i);
%Wait for the User's keypress : this allows us to run every RX band file one by one
a = input('Run the new RX file (y/n)? ','s')
if strcmpi(a,'y')
RX_combined( { W.(fields{i}) });
end
end
end
function [] = RX_combined(band)
P=int16([]);
numValues = numel(band);
for i = 1: numValues
P.Band= band{i}{1};
P.Channel_Frequency= band{i}{2};
P.RD_GAIN_1= band{i}{3};
P.RD_GAIN_ANA= band{i}{4};
P.RX_GAIN_1= band{i}{5};
P.RX_GAIN_ANA= band{i}{6};
P.RX_ULP= band{i}{7};
end
disp (P);
end
【问题讨论】:
-
您可以像
f = fieldnames(W)一样获取结构的字段名称,然后使用RX_combined(W.(f{ii}))循环遍历。那是在字段名称周围使用括号,因为它是一个字符串,其中ii是循环变量 -
@Wolfie 好的,这就是我将某个波段传递给函数的方式,但是在函数内部循环遍历波段的值呢?!
-
您想在
RX_combined函数中执行此操作,还是只想将一个标量值传递给该函数?无论哪种方式,您都应该使用带方括号的数组/一维矩阵,而不是带花括号的元胞数组,因为您的数据是数字的。然后只需在第一个(或函数内)添加另一个循环来循环数组值 -
如果这是代表你的数据,你根本不需要结构数组;二维数组会更快更容易。但是考虑到您组织数据的方式,@Wolfie 的建议只是将数据周围的大括号
{}更改为方括号[]将解决您的问题。 -
我只是想清楚我需要结构,因为每个波段本身都是一个单元,所以当我在函数“RX_combined”中遍历它时,我需要将值分配给 7 个不同的变量!所以如果我可以像在 C 中那样访问它,比如 'Band7.arg1= var1' ..etc