我使用64位matlab和32g RAM(你知道的).
我有一个130万个数字(整数)的文件(向量).我想制作另一个相同长度的矢量,其中每个点是整个第一个矢量的加权平均值,加权距离该位置的反距离(实际上它的位置是^ -0.1,不是^ -1,但是出于示例目的) .我不能使用matlab的'过滤'功能,因为它只能在当前点之前平均事物,对吧?为了更清楚地解释,这里有3个元素的例子
data = [ 2 6 9 ]
weights = [ 1 1/2 1/3; 1/2 1 1/2; 1/3 1/2 1 ]
results=data*weights= [ 8 11.5 12.666 ]
i.e.
8 = 2*1 + 6*1/2 + 9*1/3
11.5 = 2*1/2 + 6*1 + 9*1/2
12.666 = 2*1/3 + 6*1/2 + 9*1
Run Code Online (Sandbox Code Playgroud)
因此,新矢量中的每个点都是整个第一个矢量的加权平均值,加权1 /(距该位置的距离+ 1).
我可以重新制作每个点的权重向量,然后逐个元素计算结果向量,但这需要130万次for循环迭代,每个迭代包含130万次乘法.我宁愿使用直接矩阵乘法,将1x1.3mil乘以1.3milx1.3mil,这在理论上是有效的,但我无法加载大的矩阵.
然后我尝试使用shell脚本制作矩阵并在matlab中对其进行索引,因此一次只调用矩阵的相关列,但这也需要很长时间.
我没有必要在matlab中这样做,所以人们对利用如此大的数字和获得平均值的任何建议将不胜感激.因为我使用的是^ -0.1的重量,而不是^ -1,所以它不会快速下降 - 百万分之一点仍然加权为0.25,而原始点加权为1,所以我不能只是削减它因为它变大了.
希望这很清楚吗?
以下是答案的代码(因此可以格式化?):
data = load('/Users/mmanary/Documents/test/insertion.txt');
data=data.';
total=length(data);
x=1:total;
datapad=[zeros(1,total) data];
weights = ([(total+1):-1:2 1:total]).^(-.4);
weights = …Run Code Online (Sandbox Code Playgroud) 如果它们匹配ID,我想将来自不同长度的多行的值组合成一行.
输入示例是:
ID: Value:
a-1 49
a-2 75
b-1 120
b-2 150
b-3 211
c-1 289
d-1 301
d-2 322
Run Code Online (Sandbox Code Playgroud)
期望的输出示例是:
ID: Value:
a 49,75
b 120,150,211
c 289
d 301,322
Run Code Online (Sandbox Code Playgroud)
我如何编写awk表达式(或sed或grep或其他东西)来检查ID是否匹配,然后将所有这些值打印到一行?我当然可以将它们打印到不同的列中并稍后将它们组合起来,所以问题实际上只是有条件地打印,如果ID匹配并且如果没有开始新行.