我如何使用嵌套函数共享变量?(包括详细的代码)

3视图(30天)
我在构建一些代码和共享变量之间的函数和脚本。我想使用嵌套函数或类似的方法,但到目前为止不能解决我的问题。让你理解我的意图为脚本我创造了同样的效果使用全局变量,但我绝对不想使用这些。这只是为了便于说明。
我包括xlsread在主脚本,并创建data_matrix只运行一次。函数meanfun然后计算中的每一列的均值data_matrix基于给定speed1如果第2列中的数据值。输出是一个17 xc矩阵,这是完美的。然后我使用xls结果写入输出文件。
我只想运行xlswrite /读一次由于处理时间。
我只是创建结构。我需要创建各种其他功能为标准偏差和其他分析将输出。
我处理的文件有时大有时说(1000列x 100行)。所以效率是重要的对我来说。
我不能共享数据但第2列的值匹配(600:100:2200)。
如果真正的
%的代码
input_file =“inputdata_1.xlsx”;
output_file =“outputdata_1.xlsx”;
全球data_matrix speed1
speed1 = (600:100:2200);
data_matrix = xlsread (input_file);
[r c] =大小(data_matrix)
n = 2;
m = 3:1: c;
res = meanfun (n, m);
xlswrite (output_file res);
这是我创建的函数
如果真正的
%的代码
结束
函数[输出]= meanfun (ai, bi)
%函数计算每一列的平均速度
%匹配向量中的值指定位置。
全球data_matrix speed1
输出= [
意思是(data_matrix (data_matrix (:, ai) = = speed1 (1), bi))
意思是(data_matrix (data_matrix (:, ai) = = speed1 (2), bi))
意思是(data_matrix (data_matrix (:, ai) = = speed1 (3), bi))
意思是(data_matrix (data_matrix (:, ai) = = speed1 (4), bi))
意思是(data_matrix (data_matrix (:, ai) = = speed1 (5), bi))
意思是(data_matrix (data_matrix (:, ai) = = speed1 (6), bi))
意思是(data_matrix (data_matrix (:, ai) = = speed1 (7), bi))
意思是(data_matrix (data_matrix (:, ai) = = speed1 (8), bi))
意思是(data_matrix (data_matrix (:, ai) = = speed1 (9), bi))
意思是(data_matrix (data_matrix (:, ai) = = speed1 (10), bi))
意思是(data_matrix (data_matrix (:, ai) = = speed1 (11), bi))
意思是(data_matrix (data_matrix (:, ai) = = speed1 (12), bi))
意思是(data_matrix (data_matrix (:, ai) = = speed1 (13), bi))
意思是(data_matrix (data_matrix (:, ai) = = speed1 (14), bi))
意思是(data_matrix (data_matrix (:, ai) = = speed1 (15), bi))
意思是(data_matrix (data_matrix (:, ai) = = speed1 (16), bi))
意思是(data_matrix (data_matrix (:, ai) = = speed1 (17), bi))
]
结束

接受的答案

1月
1月 2018年7月4日
编辑:1月 2018年7月4日
您可以简单地使用两个变量作为输入:
res = meanfun (n, m, data_matrix speed1);
函数输出= meanfun (ai, bi, data_matrix speed1)
我不需要共享变量,当他们可以提供直接作为输入。
顺便说一下,我使用一个循环:
函数输出= meanfun (ai, bi,数据,v)
输出= 0(元素个数(v),元素个数(bi));
vdata =数据(:,ai);
k = 1:元素个数(v)
指数= (vdata = = v (k));
输出(k,:) =意味着(数据(指数(bi), 1);
结束
结束
指定操作的维度 意思是(x, 1) 更安全:当数据包含一行仅为一个特定的v (k), 意思是(x) 将操作符在船底行。
可能有一个 accumarray splitapply 命令还,这样不需要子功能。
1评论
FortuitousMonkey
FortuitousMonkey 2018年7月4日
似乎我只是在考虑变量的传递。谢谢。
我正在考虑一个循环只是想先功能代码。我要花些时间尝试两种方法通过你的自我和Guillaume更好地理解他们。具体来说,accumarray之前我评论。

登录置评。

答案(1)

Guillaume
Guillaume 2018年7月4日
编辑:Guillaume 2018年7月4日
是什么阻止了你通过 data_matrix speed1 你传递函数相同的方式 n 吗?这是最简单也是最有效的方法 分享 这些变量。
现在,有几个问题 meanfun 函数。其中最主要的是,你有一个错误,因为你没有指定哪个维度在哪个的意思。如果超过一行匹配你 speed1 你的意思是一个N x元素个数(bi)矩阵,导致1 x元素个数(bi)向量。但是如果只有一行匹配 speed1 你会的意思是1 x元素个数(bi)向量导致1 x1标量值。这将导致你contatenation错误 输出 。解决这个问题的方法是指定维度平均水平:
意思是(data_matrix (data_matrix (:, ai) = = speed1 (1), bi), 1)%,1是至关重要的!
第二个问题是,当你开始写相同的行17倍只有微小的变化,你需要认为有一个更好的办法。一个循环会使它更简单:
输出= 0(元素个数(speed1),元素个数(bi);
行= 1:元素个数(speed1)
输出(行:)=意味着(data_matrix (data_matrix (:, ai) = = speed1(行),bi), 1);% 1仍然至关重要
结束
如果你足够熟悉 accumarray 你甚至可以达到相同的没有一个循环:
(使用,destrow) = ismember (data_matrix (:, ai) speed1);
used_data =重塑(data_matrix(使用bi), [], 1);%去掉行不匹配任何speed1和重塑成列向量
destrow = destrow(使用);
输出= accumarray ([repmat (destrow元素个数(bi), 1), repelem((1:元素个数(bi))。”,元素个数(destrow))), used_data,[元素个数(speed1),元素个数(bi)], @mean, NaN);
3评论
FortuitousMonkey
FortuitousMonkey 2018年7月4日
输出= 0(元素个数(speed1),元素个数(bi));
行= 1:元素个数(speed1)
输出(行:)=意味着(data_matrix (data_matrix (:, ai) = = speed1(行),bi), 1);% 1仍然至关重要
结束
添加丢失的支架。

登录置评。

标签

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!