我有以下形式的功能:
function Out = DecideIfAPixelIsWithinAnEllipsoidalClass(pixel,means,VarianceCovarianceMatrix)
ellipsoid = (pixel-means)'*(VarianceCovarianceMatrix^(-1))*(pixel-means);
if ellipsoid <= 1
Out = 1;
else
Out = 0;
end
end
Run Code Online (Sandbox Code Playgroud)
我正在使用matlab进行遥感过程,我想对LandSatTM图像进行分类.这张图片有7个波段,是2048*2048.所以我将它们存储在3个2068*2048*7矩阵中.这个函数意味着是7*1使用名为ExtractStatisticalParameters和VarianceCovarianceMatrix的函数中的类的样本先前计算的矩阵是一个7*7矩阵,实际上你看到:
ellipsoid = (pixel-means)'*(VarianceCovarianceMatrix^(-1))*(pixel-means);
Run Code Online (Sandbox Code Playgroud)
是一个椭圆体的方程式.我的问题是,每次你可以传递一个像素(它是一个7*1向量,其中每一行是一个分离的带中的像素的值)到这个函数,所以我需要写一个循环像这样:
for k1=1:2048
for k2=1:2048
pixel(:,1)=image(k1,k2,:);
Out = DecideIfAPixelIsWithinAnEllipsoidalClass(pixel,means,VarianceCovarianceMatrix);
end
end
Run Code Online (Sandbox Code Playgroud)
而且你知道系统需要很多时间和精力.你能建议我减少系统压力吗?
我有一个MxN矩阵,我想要一个列向量v,使用向量s告诉我矩阵中的每一行我将采取什么列.
这是一个例子:
Matrix =
[ 4 13 93 20 42;
31 18 94 64 02;
7 44 24 91 15;
11 20 43 38 31;
21 42 72 60 99;
13 81 31 87 50;
32 22 83 24 04]
s = [4 4 5 4 4 4 3].'
Run Code Online (Sandbox Code Playgroud)
而期望的输出是:
v = [20 64 15 38 60 87 83].'
Run Code Online (Sandbox Code Playgroud)
我想用这个表达方式
Matrix(:,s)
Run Code Online (Sandbox Code Playgroud)
会工作,但事实并非如此.有没有使用for循环分别访问行的解决方案?
首先,我应该说我找不到适合我的问题的标题,所以我很感激任何编辑标题的人!
假设我有一个18432x1472矩阵,我想用这种形式将它转换为3072x1472矩阵(18432/6 = 3072):
元素的平均值(1,6),(2,6),...,(6 ,6)旧矩阵将转到新矩阵的元素(1,1)中旧矩阵的元素(7,6),(8,6),...,(12,6)的均值将转到新的元素(2,1),依此类推
到目前为止,我已经编写了这段代码:
function Out = MultiLooking( In )
MatrixIn = double(In);
m = size(In,1);
InTranspose = MatrixIn';
A = zeros(m,m/6);
for i = 1:(m/6)
A(6*(i-1)+1,i) = 1;
A(6*(i-1)+2,i) = 1;
A(6*(i-1)+3,i) = 1;
A(6*(i-1)+4,i) = 1;
A(6*(i-1)+5,i) = 1;
A(6*(i-1)+6,i) = 1;
end
X = (InTranspose*A)/6;
Out1 = X';
Out = uint8(Out1);
end
Run Code Online (Sandbox Code Playgroud)
但它的速度很慢,对于我的极化SAR数据,计算机在运行此代码时会被暂停一段时间,所以我需要代码运行得更快!
任何人都可以建议我更快的代码来做这个目的???
在MATLAB中,我有一个长度为n的向量x,其中n通常是O(10),我想构建一个大小为[n ^ m,m]的高矩阵A,其中m再次为0(10).矩阵具有一种特殊的形式:如果n = 4且m = 6,则让
x=[x1; x2; x3; x4]
Run Code Online (Sandbox Code Playgroud)
那么A是
x1 x1 x1 x1 x1 x1
x2 x1 x1 x1 x1 x1
x3 x1 x1 x1 x1 x1
x4 x1 x1 x1 x1 x1
x1 x2 x1 x1 x1 x1
x2 x2 x1 x1 x1 x1
x3 x2 x1 x1 x1 x1
x4 x2 x1 x1 x1 x1
x1 x3 x2 x1 x1 x1
. .
. .
. .
x4 x4 x4 x4 x4 x4
Run Code Online (Sandbox Code Playgroud)
实际上,每列都是通过重复x的元素获得的,每列的步幅越来越大.我怎样才能做到这一点?如果可能的话,我更喜欢有效的(矢量化)解决方案,因为正如您所看到的,A的行数随m呈指数增长.非常感谢,
塞尔吉奥 …
我是Python的新手,我必须实现此代码的"尽快"版本.
s="<%dH" % (int(width*height),)
z=struct.unpack(s, contents)
heights = np.zeros((height,width))
for r in range(0,height):
for c in range(0,width):
elevation=z[((width)*r)+c]
if (elevation==65535 or elevation<0 or elevation>20000):
elevation=0.0
heights[r][c]=float(elevation)
Run Code Online (Sandbox Code Playgroud)
我已经阅读了一些python矢量化问题......但我不认为它适用于我的情况.大多数问题都是使用np.sum而不是使用for loops.我想我有两个问题:
heights[r][c]=float(elevation)是瓶颈所在.我需要找一些Python计时命令来确认这一点.cython,pypy,weave.我可以在C中更快地完成这个,但是这段代码也需要生成图,所以我想坚持使用Python,这样我就可以使用了matplotlib.我正在将一些代码从R移植到julia以熟悉该语言,并且我发现了一些不能平滑翻译的模式.考虑以下功能,
# Ricatti-Bessel and derivatives up to nmax, vectorised over x
function rb(x, nmax)
n = 1:nmax
nu = 0.5 + [0, n]
bj = hcat([besselj(nu, _x) for _x in x]...).'
# ^ first question ^
sq = repmat(sqrt(pi/2*x), 1, nmax+1)
bj .*= sq
xm = repmat(x, 1, nmax)
nm = repmat(n', length(x), 1)
# ^ second question ^
dpsi = bj[:,n] - nm .* bj[:,n+1] ./ xm
psi = bj[:,n+1]
return psi, dpsi # it'd be nice to return …Run Code Online (Sandbox Code Playgroud) 我有一个数组,其中包含一些属于集合的值.我想在二进制矩阵中转换此数组,此矩阵的每一列将表示该集合的每个可能值,对于与输入数组匹配的列,行值为1,对于所有其他列,行值为0.我认为这个名字就像二元枢轴.
输入数组是表类型的列
输入数组的示例(前面的示例只是大写字母,导致误解):
'Apple'
'香蕉'
'樱桃'
'Dragonfruit''Apple
'
'樱桃'
所以,在这个例子中,输入可以假设4个不同的值:'Apple','Banana','Cherry'或'Dragonfruit',在我的真实场景中它可以超过4.
示例输出矩阵:
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
1 0 0 0
0 0 1 0
我已经实现了这种期望的行为,但我想知道是否有更好的方法来执行此操作.以矢量化方式(没有每个类别的for循环)或使用内置函数.
function [ binMatrix, categs ] = pivotToBinaryMatrix( input )
categorizedInput = categorical(input);
categs = categories(categorizedInput);
binMatrix = zeros(size(atributo, 1), size(categorias, 1));
for i = 1: size(caters,1)
binMatrix(:,i) = ismember(categorizedInput, categs(i));
end
end
Run Code Online (Sandbox Code Playgroud)
对于包含9个类别的约50,000个条目,它在0.075137秒内执行.
编辑:我改进了这些例子,因为之前的例子导致了误解.
我想将X,Y,Z numpy数组转换为(X * Z)* Y numpy数组。
代码(慢):
def rearrange(data):
samples,channels,t_insts=data.shape
append_data=np.empty([0,channels])
for sample in range(0,samples):
for t_inst in range(0,t_insts):
channel_data=data[sample,:,t_inst]
append_data=np.vstack((append_data,channel_data))
return append_data.shape
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种更好的矢量化方法
我有N乘M矩阵A,1乘M矩阵或行向量B和另外1乘M行向量C.我可以更多地向量化下面的代码吗?
for i = 1:N
A(i,:) = (A(i,:)-B)./C;
end;
Run Code Online (Sandbox Code Playgroud)
那么我们有K个M矩阵(K可以被N整除)而不是矢量的更一般情况呢?
如何在3D数组的轴上应用在2D数组(cdist)上运行的函数?
我尝试使用numpy.apply_along_axis,但是我需要在2D阵列而不是1D上进行操作。我通过沿一个轴进行迭代获得了所需的结果,但如果可能的话,我希望将其向量化:
from scipy import spatial
import numpy as np
a = np.random.randn(600).reshape(10, 20, 3)
distances = np.array([spatial.distance.cdist(a[i,:,:], a[i,:,:]) for i in range(a.shape[0])])
Run Code Online (Sandbox Code Playgroud)