我想知道你是否可以帮助这个Matlab编程问题。我有一个类似的表:
31/01/2023 01/02/2023 02/02/2023 03/02/2023
02/01/2023 202,00 228,5 219 198
03/01/2023 195,00 215 206 206
04/01/2023 182,00 196 191 185
05/01/2023 185,00 202 200 198
06/01/2023 184,00 206 200 198
07/01/2023 182,00 207 207 199
08/01/2023 180,00 199 195 192
09/01/2023 179,00 192 189 184
我想计算每一列的回报率,所以(195/202),(182/195),(185/182).所以基本上对于每一列,行的值/行的值为-1。
你能帮帮我吗?
我在Matlab中试过这段代码,但不起作用(表的名称是“ret_table”)。
for col = 2:size(ret_table, 2)
for row = 2:size(ret_table, 2)
current_value = ret_table{row, col};
previous_value = ret_table{row-1, col};
if isnumeric(current_value) && isnumeric(previous_value)
ret_table{row, col} = (current_value / previous_value);
end
end
end
它会变成这样:
31/01/2023 01/02/2023 02/02/2023 03/02/2023
02/01/2023 NaN NaN NaN NaN
03/01/2023 -0,04 -0,06 -0,06 0,04
04/01/2023 -0,07 -0,09 -0,08 -0,11
05/01/2023 0,02 0,03 0,05 0,07
06/01/2023 -0,01 0,02 - -
07/01/2023 -0,01 0,00 0,03 0,01
08/01/2023 -0,01 -0,04 -0,06 -0,04
09/01/2023 -0,01 -0,04 -0,03 -0,04
但我一直得到这个错误:使用/参数时出错,参数必须是数字、字符或逻辑。
如果使用“./”:使用./时出错,两个输入必须具有相同的行标签。
编辑:我是这样解决的:
ret_table = array2table(PUN_fwd);
for col = 2:size(ret_table, 2)
for row = 2:size(ret_table, 1)
current_value = table2array(ret_table{row, col});
previous_value = table2array(ret_table{row-1, col});
Returns{row, col} = log1p(current_value / previous_value);
end
end
2条答案
按热度按时间zsbz8rwp1#
代码中有两件事值得注意。
第一个是在
row = 2:size(ret_table, 2)
行上,你应该在维度1而不是2上循环,以遍历所有的行,这意味着“row = 2:size(ret_table,1)”。只有当你有一个正方形表时,在2上循环才能令人满意地工作,这是一个不安全的假设。第二,你没有得到预期的结果,因为在
ret_table{row, col} = (current_value / previous_value);
行,你在每次循环中都修改了表本身。所以每次你都不是使用原始的ret_table
元素,而是在前一次迭代中使用它进行的计算。解决这个问题的方法是创建一个表的副本,并在解析原始表的同时修改副本(参见代码中的注解)。这将得到以下结果:
最后,您需要为第一行建立一个规则,因为显然不能在第一行执行操作,因为没有可供使用的先例元素。
z2acfund2#
我是这样解决的: