标签: vectorization

使用Matlab快速获得满足条件的矩阵部分

我需要一种快速的方法来获取矩阵中的零件并将它们堆叠在一个新的矩阵中.假设我有一个像这样的矩阵:

M =

 1    45     4
 1    91    15
 2    34    89
 3    89     9
 3    96    99
Run Code Online (Sandbox Code Playgroud)

现在我想例如获取最后两列中的所有元素,左列具有值[1; 3],即输出应如下所示:

 45     4
 91    15
 89     9
 96    99
Run Code Online (Sandbox Code Playgroud)

为了获得例如第一列上对应于1的部分,我可以做到

M(M(:,1) == 1,2:end), 
Run Code Online (Sandbox Code Playgroud)

并且我可以使用'或'逻辑来获得与[1; 3]对应的部分,但在实际情况下,我将有一个长整数向量...是否有矢量化的方式来做这个?

我认为for循环也可能非常快,但矩阵的各个部分大小不同,快速堆叠起来可能很困难......

arrays matlab matrix vectorization

2
推荐指数
1
解决办法
66
查看次数

Vectorize IF语句

我试图在Matlab中对if语句进行矢量化,我不知道该怎么做.我想为正值分配'N',为负值分配'S'.我想避免使用for循环,但这是我的代码:

LatDD = [23.0,12.3,-43.2,9.9,-40.7];
LatDir = ['' '' '' '' ''];
if (LatDD < 0)
    LatDir = 'S'
else
    LatDir = 'N'
end
Run Code Online (Sandbox Code Playgroud)

显然这不能做我想要的,因为它实际上只检查LatDD的第一个元素.我可以很容易地做一个for循环,但我希望它是矢量化的.我尝试了逻辑索引,但所有得到我的是另一个带有零或者的向量,无论如何我都要检查for循环.

matlab vectorization

2
推荐指数
1
解决办法
94
查看次数

在MATLAB中有效地循环向量

在Matlab中我们有这样的场景:

v =[1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 .... N N N N];
Run Code Online (Sandbox Code Playgroud)

其中v中的元素总是以1到N的递增顺序,我们知道N的值.我们想要计算'1''2'...的数量.

我们肯定可以使用如下循环:

for i =  1 : N
    % method A
    tic
    ind = find(v == i)
     ---> do sth with ind 
    t1 = toc;

    % method B
    tic
    ind = v(v == i)
     ---> do sth with ind 
    t2 = toc;

    % method C
    tic
    ind = …
Run Code Online (Sandbox Code Playgroud)

matlab vector vectorization

2
推荐指数
1
解决办法
74
查看次数

如何计算python中两个向量数组的点积?

A and B都是数组shape(N,3).它们每个包含N个向量,使得A[0] = a0 (vector), A[1] = a1...B[0] = b0, B[1] = b1...

我想计算N对向量a和bn的点积.换句话说,我想获得一个数组C,shape(N,1)这样C[i] = np.dot(A[i],B[i]).在python中执行此操作的最有效方法是什么(例如使用向量化代码)?

python numpy linear-algebra vectorization scipy

2
推荐指数
1
解决办法
6506
查看次数

如何在保持一个值不变的情况下翻转SSE中的范围?

我有一个8位无符号8位数的向量,范围为0 .. 12 in xmm0.我想对e向量中的每个元素执行以下转换:

if (e != 12)
    e = 11 - e;
Run Code Online (Sandbox Code Playgroud)

也就是说,数字0,1,...,11被改变为11,10,...,0而12保持不变.其他值不会发生,我不在乎它们会发生什么.

如何使用SSE4指令集有效地实现此操作?

x86 assembly sse x86-64 vectorization

2
推荐指数
1
解决办法
64
查看次数

在此MATLAB脚本中替换for循环

有什么办法可以避免在下面的代码中使用循环吗?我正在做一个简化求和,即对a中的相同索引的所有值进行分组和求和.

a = [ 1 3 2 3 1 2]
b = [0.1 0.2 0.3 0.4 0.5 0.6]
for i = unique(a)
     c(i) = sum(b(ismember(a, i)))
 end
Run Code Online (Sandbox Code Playgroud)

matlab vectorization

2
推荐指数
1
解决办法
56
查看次数

有没有办法将struct(:).a(:,1)矢量化为数组(:,:)?

for如果可能的话,我有以下代码,我感兴趣的是从循环转换为向量操作.前提是给定结构数组data,每个元素都有一个a包含单个列向量的字段.所有字段a上的所有列向量都是相同的长度.我想从所有字段中获取每个列向量,并将数据转换为矩阵,其中每列包含来自a此数组中字段的一个列向量.这意味着第一列应该是data(1).a,第二列应该是data(2).a,依此类推.

    % All arrays in 'data.a' are column vectors of equal length
    % (leaving 'numCols' in incase some genius can also make that general)
    [numRows,numCols] = size(data(1).a);

    % Pre-allocate for speed
    array1 = NaN(numRows,numCols);

    % Convert from struct to array
    for ii = 1:length(data)
        array1(:,ii) = data(ii).a;
    end
Run Code Online (Sandbox Code Playgroud)

matlab vectorization

2
推荐指数
1
解决办法
57
查看次数

使用匿名函数而不是循环来汇总单元格数组中的值

我有一个叫做数据的矩阵.它包含3列,公司名称,公司价值和公司货币,如下所示.

  Name      Value      Currency
  ABC       10         USD
  MNO       5          JPY
  PLM       3          USD
  NJK       7          EUR
Run Code Online (Sandbox Code Playgroud)

我需要总结每种货币的总价值,所以我的答案如下所示,

 Currency    Value
 EUR         7
 JPY         5
 USD         13
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用循环执行此操作,但是可以使用匿名函数,如果是这样,怎么办?

更新 - 原始帖子的额外信息缺乏信息

以下是我的解决方案,它有效.然而,我看到人们使用cellFun或匿名函数,并且就像这种性质的问题有一种更有效的方式(并且会喜欢替代方式)

val     = cell2mat(data(:, 2));              % double - value
sedols  = data(:, [1 3]);                   % cell - name (1st column) and currency (2nd column)

ccy     = unique(sedols(:, 2));
fx_exp  = zeros(length(ccy(:, 1)), 1);

for n = 1 : length(ccy(:, 1))
    index           = strmatch(ccy(n, 1), sedols(:, 2));
    fx_exp(n, 1)    = sum(val(index));
end
Run Code Online (Sandbox Code Playgroud)

arrays matlab vectorization

2
推荐指数
1
解决办法
39
查看次数

有效计算Haversine距离的最小值

我有一个数据帧> 2.7mm的坐标,和一个单独的列表〜2000坐标.我试图返回的坐标之间的最小距离每个单排相比,列表中的每个坐标.以下代码适用于小规模(具有200行的数据帧),但是当计算超过2.7MM的行时,它似乎永远运行.

from haversine import haversine

df
Latitude   Longitude
39.989    -89.980
39.923    -89.901
39.990    -89.987
39.884    -89.943
39.030    -89.931

end_coords_list = [(41.342,-90.423),(40.349,-91.394),(38.928,-89.323)]

for row in df.itertuples():
    def min_distance(row):
        beg_coord = (row.Latitude, row.Longitude)
        return min(haversine(beg_coord, end_coord) for end_coord in end_coords_list)
    df['Min_Distance'] = df.apply(min_distance, axis=1)
Run Code Online (Sandbox Code Playgroud)

我知道问题在于发生的大量计算(5.7MM*2,000 = ~11.4BN),并且运行这么多循环的事实非常低效.

根据我的研究,似乎矢量化NumPy函数可能是更好的方法,但我是Python和NumPy的新手,所以我不太确定如何在这种特殊情况下实现它.

理想输出:

df
Latitude   Longitude  Min_Distance
39.989    -89.980     3.7
39.923    -89.901     4.1
39.990    -89.987     4.2
39.884    -89.943     5.9
39.030    -89.931     3.1
Run Code Online (Sandbox Code Playgroud)

提前致谢!

python numpy vectorization haversine pandas

2
推荐指数
1
解决办法
614
查看次数

从具有特定索引而没有循环的向量创建矩阵

我有一个矢量和这样的矩阵:

v = [0.3 -3 3 -2 7 6]
INDEX = [1 3; 3 5; 4 6]
Run Code Online (Sandbox Code Playgroud)

INDEX是表示在第一和最后一个元素的矩阵v,该RESULT行必须有.我要确保在每一个时间间隔INDEX,即 1 to 3,3 to 54 to 6具有相同的长度,所以在每一行RESULT矩阵具有相同的长度.

我想获得这样的矩阵:

RESULT = [0.3 -3  3; 
            3 -2  7; 
           -2  7  6] 
Run Code Online (Sandbox Code Playgroud)

没有for循环怎么做?

indexing matlab vector matrix vectorization

2
推荐指数
1
解决办法
71
查看次数