Matrix 朱莉娅:向量和列式矩阵上的函数有共同的风格吗?
例如,计算每个列向量的平均值和标准偏差的函数 对于矢量:Matrix 朱莉娅:向量和列式矩阵上的函数有共同的风格吗?,matrix,vector,julia,Matrix,Vector,Julia,例如,计算每个列向量的平均值和标准偏差的函数 对于矢量: function meanstd(x::Vector) len = length(x) m = 0 m2 = 0 for i = 1:len m += x[i] m2 += x[i]*x[i] end s = sqrt.((m2 - m.*m./len)./(len-1)) m /= len m, s end 对于矩阵: function m
function meanstd(x::Vector)
len = length(x)
m = 0
m2 = 0
for i = 1:len
m += x[i]
m2 += x[i]*x[i]
end
s = sqrt.((m2 - m.*m./len)./(len-1))
m /= len
m, s
end
对于矩阵:
function meanstd(x::Matrix)
len, d2 = size(x)
m = zeros(d2)
m2 = zeros(d2)
for j=1:d2
for i = 1:len
m[j] += x[i,j]
m2[j] += x[i,j]*x[i,j]
end
end
s = zeros(d2)
for j = 1:d2
s[j] = sqrt.((m2[j] - m[j].*m[j]./len)./(len-1))
m[j] /= len
end
m, s
end
如何编写两种类型都具有通用语法的唯一快速函数
UPD:
trailingsize
函数(import Base.trailingsize
)给出数组下一个维度的大小,即使该维度不存在
ndims(v)
函数给出维度总数
对于矩阵的向量和列,此特定函数可概括如下(但其输出类型始终为数组,如果是一个数字,则为事件):
function meanstd(x::Array{T}),我在这方面不是专家,但我怀疑答案在第75行。(这是mean
在Base
中对抽象数组和执行操作的数组区域的mean
的实现——如果我有更多的时间,我会尝试解决它,因为我对自己感兴趣!)Sairus不太清楚你的意思,但是maplast(f,x)=挤压(mapslices(f,x,1),怎么样
?如果问题是关于样式,我认为惯例是让数组参数后跟一个标量维度或一个要操作的维度列表,返回一个大小至少与剩余维度对应的结构(请参见前面注释中的mapslices
)。一个语言无关的注释,我建议在尝试实现某些东西之前阅读有关数值稳定性的内容。我不是这方面的专家,但我怀疑答案在第75行。(这是mean
在Base
中对抽象数组和执行操作的数组区域的mean
的实现——如果我有更多的时间,我会尝试解决它,因为我对自己感兴趣!)Sairus不太清楚你的意思,但是maplast(f,x)=挤压(mapslices(f,x,1),怎么样
?如果问题是关于样式,我认为惯例是让数组参数后跟一个标量维度或一个要操作的维度列表,返回一个大小至少与剩余维度对应的结构(请参见前面注释中的mapslices
)。一个语言无关的注释,我建议在尝试实现某些东西之前先阅读有关数值稳定性的内容。
function meanstd(x::Array{T}) where T<:Real
len = size(x,1)
d2 = ndims(x) == 1 ? 1 : size(x,2);
s = zeros(1, d2)
m = zeros(1, d2)
m2 = zeros(1, d2)
for j=1:d2
for i = 1:len
m[j] += x[i,j]
m2[j] += x[i,j]*x[i,j]
end
end
for j = 1:d2
s[j] = sqrt.((m2[j] - m[j].*m[j]./len)./(len-1))
m[j] /= len
end
m, s
end