我在MATLAB两个矩阵让说arr1和arr2尺寸1000*1000的每一个.我想比较它们的元素并将结果保存在resarr1000*1000 的结果矩阵中,以便每个元素:
arr1大于in arr2,则将值1放在结果中arr2更大,则存储值2但是我不想用for循环来做这个,因为那个更慢.我怎样才能做到这一点?
编辑:
另外,如果我想不同的RGB值存储在一个1000×1000×3矩阵的结果,取决于比较arr1和arr2,可以在不慢的循环来实现?
例如,store(255,0,0)if arr1更大,(0,255,0)if arr2更大
假设我有一个这样的矩阵:
a =
1 2
3 4
Run Code Online (Sandbox Code Playgroud)
我想将矩阵的大小加倍并创建如下内容:
aa =
1 1 2 2
1 1 2 2
3 3 4 4
3 3 4 4
Run Code Online (Sandbox Code Playgroud)
以这种方式,第一矩阵中的每个元素传播到较大矩阵中的四个元素.
a(i,j) == aa(2*i-1, 2*j-1)
== aa(2*i , 2*j-1)
== aa(2*i-1, 2*j)
== aa(2*i , 2*j)
Run Code Online (Sandbox Code Playgroud)
是否有任何预定义的功能来做到这一点?
我绝对可以通过两个循环来做到这一点,但我想要最简单,最干净的方式!
我看到了另一个问题,但他只在一个索引上运行.我需要在不使用for循环的情况下对列和行索引进行操作.有没有办法做到这一点:
设M(a,b)为矩阵,大小为括号中的一个.我想将每个元素操作为exp((mn)^ 2)
Geetings,这是一个小问题.
我有一个矢量v(size(v)= T),一个正数P,P <T nad正数N,N <T.并且想要制作大小为PxN的矩阵M,这样:
M = [v(T), v(T-1), ....., v(T-N+2), v(T-N+1);
v(T-1), v(T-2), ....., v(T-N+1), v(T-N) ;
v(T-2), v(T-3), ....., v(T-N), v(T-N-1);
. . . . . ;
. . . . . ;
v(T-P+1), v(T-P), ....., v(T-P-N+3), v(T-P-N+2)]
Run Code Online (Sandbox Code Playgroud)
它认为T> P + N.
让我们举个例子.
v = [1, 2, 3, 4, 5]';
P = 3;
N = 3;
M = [5, 4, 3;
4, 3, 2;
3, 2, 1]
Run Code Online (Sandbox Code Playgroud)
我知道如何使用for循环来做这个,但我也认为可以通过向量化来实现 - 这里的问题是 - 我在矢量化方面不是很熟练.
Thx提示等等:))
考虑A = [ 200000 x 1]矢量.我有另一个矢量idx = [200000x1].我想平铺A这样ithA的每个元素都是平铺idx(i)时间.
例如:
A idx output
2 2 2
3 1 2
4 3 3
5 1 4
. . 4
. . 4
. . 5
. . .
Run Code Online (Sandbox Code Playgroud)
任何非循环的想法?
我有两个分别称为权重和索引的数组:
weights = [1, 3, 2];
indices = [1, 1, 2, 3, 2, 4];
m = 4; % Number of Rows in Matrix
n = 3; % Number of Columns in Matrix
M = zeros(m, n);
Run Code Online (Sandbox Code Playgroud)
名为indices的数组存储索引,我需要在每列中存储1.
例如,对于在索引(1)中指示的第1行的第一列,我需要存储1,并且这由权重(1)表示,其等于1.
M(indices(1), 1) = 1;
Run Code Online (Sandbox Code Playgroud)
对于第2列,在第1行到第3行(索引(2:4))我需要存储1.第2列的索引范围再次由权重(2)表示.
M(indices(2:4),2) = 1;
Run Code Online (Sandbox Code Playgroud)
类似地,对于第3列,在列2和4(指数(5:6))我需要存储1指数对第3列的范围由权重再次(3)表示.
M(indices(5:6),3) = 1;
Run Code Online (Sandbox Code Playgroud)
预期和结果二进制矩阵是:
1 1 0
0 1 1
0 1 0
0 0 1
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以通过使用权重和索引数组以广义的方式做到这一点,而不是以硬编码的方式来创建创建二进制矩阵M?
是否有内置的NumPy函数或任何矢量化方法生成值n大于1 的以下2D NumPy矩阵?让我为等于2、3和4 的所需矩阵给出一些示例n。
一种方法是在下三角部分构造一个1的矩阵,然后简单地乘以一个向量np.arange(1, n+1)。还有其他选择吗?
import numpy as np
Run Code Online (Sandbox Code Playgroud)
对于n = 2
n = 2
arr = np.array([[1, 0], [2, 2]])
# array([[1, 0],
# [2, 2]])
Run Code Online (Sandbox Code Playgroud)
对于n = 3
n = 3
arr = np.array([[1, 0, 0], [2, 2, 0], [3, 3, 3]])
# array([[1, 0, 0],
# [2, 2, 0],
# [3, 3, 3]])
Run Code Online (Sandbox Code Playgroud)
对于n = 4
n = 4
arr = np.array([[1, 0, 0, 0], [2, …Run Code Online (Sandbox Code Playgroud) 它可能看起来像一个有趣的问题,但是R生成如下所示的2行矩阵的最快方法是:
cc = NULL
n1 = 1000
n2 = 1000000
for (i in 0:n1)
for (j in 0:n2)
cc = c(cc, i, j)
cbn = matrix(cc, nrow = 2)
Run Code Online (Sandbox Code Playgroud) 我有两个数组:
timesteps = [1,3;5,7;9,10];
data = [1,2,3,4,5,6,7,8,9,10];
Run Code Online (Sandbox Code Playgroud)
timesteps数组中的值描述了data我想要的值。第一列开始,第二列结束。
例如我在这里想得到[1,2,3,5,6,7,9,10]。
所以这段代码对我来说很好用,但是由于for循环的缘故,它非常慢... Matlab中是否有一个内衬,所以我可以摆脱for循环?
newData=[];
for ind=1:size(timesteps,1)
newData=cat(2,newData,data(timesteps(ind,1):timesteps(ind,2)));
end
Run Code Online (Sandbox Code Playgroud)
编辑:通过Wolfie的解决方案,我得到了以下(非常好的)结果。(我只使用了一个小数据集,通常是大数据集的50倍。)
(Mine) Elapsed time is 48.579997 seconds.
(Wolfies) Elapsed time is 0.058733 seconds.
Run Code Online (Sandbox Code Playgroud) 背景:斐波那契数字是一系列数字,其中每个数字(斐波那契数字)是前面两个数字的总和。一个简单的例子是:1、1、2、3、5、8等。
我试图了解如何检测矢量是否包含斐波那契数。是否可以通过向量化操作来完成此操作(我的意思是不使用循环)?
vectorization ×10
matlab ×7
matrix ×5
optimization ×2
r ×2
arrays ×1
comparison ×1
for-loop ×1
indexing ×1
indices ×1
loops ×1
numpy ×1
performance ×1
python ×1
size ×1
tiling ×1
vector ×1