我想生成正随机半定矩阵.我正在寻找算法或更优选地用C,matlab,java或任何语言的算法的简单实现.
我开始相信数据框没有矩阵优势,除了符号方便.但是,当unique在矩阵和数据帧上运行时,我注意到这种奇怪:它似乎在数据帧上运行得更快.
a = matrix(sample(2,10^6,replace = TRUE), ncol = 10)
b = as.data.frame(a)
system.time({
u1 = unique(a)
})
user system elapsed
1.840 0.000 1.846
system.time({
u2 = unique(b)
})
user system elapsed
0.380 0.000 0.379
Run Code Online (Sandbox Code Playgroud)
随着行数的增加,定时结果更加明显.所以,这个问题有两个部分.
为什么矩阵的速度会变慢?转换为数据帧,运行unique,然后转换回来似乎更快.
有什么理由不只是包装unique中myUnique,它执行转换部分#1?
注意1.鉴于矩阵是原子的,unique对于矩阵来说似乎应该更快,而不是更慢.能够迭代固定大小的连续内存块通常比运行在链接列表的单独块上更快(我假设数据帧是如何实现的......).
注2:如表现所示data.table,unique在数据框或矩阵上运行是一个相对糟糕的想法 - 请参阅Matthew Dowle的答案和相关时间的评论.我已经将很多对象迁移到数据表中,这种性能是另一个原因.因此,尽管用户应该很好地采用数据表,但出于教学/社区的原因,我现在要问的问题是,为什么这需要花费更长的时间来处理矩阵对象.下面地址的答案,其中没有时间去了,怎么回事,我们可以得到更好的性能(即数据表).这个问题的答案,为什么就在眼前-该代码可以通过发现unique.data.frame和unique.matrix.:)一个英语解释它正在做什么以及为什么缺乏这一切.
我想知道任何一个着名的Java矩阵库,比如Colt或EJML,是否实际上提供了与MatLab类似的功能?例如,我似乎无法在API简单方法的定义中找到彼此相加或相减两个矩阵/向量的任何地方,这似乎是最常用的操作.我错过了什么吗?
想象一下,我有两个数组:
a = [1, 2, 5, 7, 6, 9, 8, 3, 4, 7, 0];
b = [5, 9, 6];
Run Code Online (Sandbox Code Playgroud)
我想在a(只有第一个命中)中找到b值的索引,即:
c = [3, 6, 5];
Run Code Online (Sandbox Code Playgroud)
有没有一个简单的Matlab原生方式来做这个没有循环和搜索.
我试过用find():
find(a == b)
Run Code Online (Sandbox Code Playgroud)
如果你这样做会有效:
for i = 1:length(b)
index = find(a == b(i));
c = [c, index(1)]
end
Run Code Online (Sandbox Code Playgroud)
但是它比这更容易理想.
众所周知,如果列的行或行维度为1,则R会尝试将矩阵减少为向量.可以通过使用该drop=F命令来防止维度的自动删除.
但是,我目前正在编写一个大型R包,并且需要在我的代码中禁用几百次的维度丢弃,因此我必须手动查找这些位置并添加drop=F 数百次.
因此,我想知道是否有任何选项或可能通常禁用R中矩阵的维数下降?
如果我创建了几个矩阵,我怎样才能将它们组合成一个数组呢?我有8个矩阵,每个矩阵有200行和200列,我需要将它们组合成一个dim = 200,200,8的数组.所以我希望我的每个矩阵都是我的数组的一部分.
下面的代码会导致异常.为什么?
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void main() {
try {
Mat m1 = Mat(1,1, CV_64F, 0);
m1.at<double>(0,0) = 0;
}
catch(cv::Exception &e) {
cerr << e.what() << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
错误如下:
OpenCV Error: Assertion failed (dims <= 2 && data && (unsigned)i0 < (unsigned)size.p[0] && (unsigned)(i1*DataType<_Tp>::channels) < (unsigned)(size.p[1]*channels()) && ((((sizeof(size_t)<<28)|0x8442211) >> ((DataType<_Tp>::depth) & ((1 << 3
) - 1))*4) & 15) == elemSize1()) in unknown function, file %OPENCV_DIR%\build\include\opencv2\core\mat.hpp, line 537
Run Code Online (Sandbox Code Playgroud)
UPDATE
如果跟踪此代码,我看到构造函数行调用构造函数
inline Mat::Mat(int …Run Code Online (Sandbox Code Playgroud) 在MATLAB中转置向量/矩阵时,我已经看过并使用了'(撇号)运算符很长一段时间.
例如:
>> v = [ 1 2 3 ]'
v =
1
2
3
Run Code Online (Sandbox Code Playgroud)
然而,这是我最近发现的共轭转置,或者ctranspose.
这似乎只涉及涉及复杂数字的情况,如果您想要转换矩阵而不获取共轭,则需要使用.'opertator.
那么使用.'真实矩阵和向量是否是好习惯?我们应该怎样教MATLAB初学者?
我需要用0填充矩阵距离.我该怎么做?
distances <- matrix(1:25, nrow=5, ncol=5)
apply(distances, c(1, 2), function(x) 0)
Run Code Online (Sandbox Code Playgroud) 给定2D(M x N)矩阵和2D内核(K x L),我如何返回一个矩阵,该矩阵是使用图像上给定内核的最大或均值池的结果?
如果可能的话,我想使用numpy.
注意:M,N,K,L可以是偶数或奇数,并且它们不需要彼此完全可分,例如:7x5矩阵和2x2内核.
例如,最大池:
matrix:
array([[ 20, 200, -5, 23],
[ -13, 134, 119, 100],
[ 120, 32, 49, 25],
[-120, 12, 09, 23]])
kernel: 2 x 2
soln:
array([[ 200, 119],
[ 120, 49]])
Run Code Online (Sandbox Code Playgroud)