- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我尝试使用 Qt C++ 中的 Julia 语言来获取 SVD 函数的结果:
jl_value_t *array_type = jl_apply_array_type(jl_float64_type, 2);
jl_array_t *x = jl_alloc_array_2d(array_type, matrixForSvd.rows(), matrixForSvd.cols());
jl_value_t * bol = jl_box_bool(true);
double *p = (double*)jl_array_data(x);
int ndims = jl_array_ndims(x);
size_t size0 = jl_array_dim(x,0);
size_t size1 = jl_array_dim(x,1);
// Fill array with data
for(size_t i=0; i<size1; i++)
for(size_t j=0; j<size0; j++)
p[j + size0*i] = matrixForSvd(j,i);
jl_function_t *func = jl_get_function(jl_base_module, "svd");
jl_tupletype_t *y = (jl_tupletype_t*)jl_call1(func, (jl_value_t*)x);
但是当我尝试解析 y
时,我得到了很多垃圾(没关系),只有 U
和 V
而不是 S
:
double *res = (double*)jl_array_data(y);
for(int t = 0; t < 50; t++){
cout<<res[t]<<endl;
}
输出:
6.94448e-310
1.97626e-323
2.7725e-318
9.88131e-324
9.88131e-324
0
-0.404554 //U
-0.914514
-0.914514
0.404554
0
6.94448e-310
6.94448e-310
1.97626e-323
2.7725e-318
9.88131e-324
9.88131e-324
0
-0.576048 //V
0.817416
-0.817416
-0.576048
0
6.94448e-310
6.94448e-310
1.97626e-323
2.7725e-318
那么,我怎样才能从像 SVD 这样的 Julia 函数中正确获取元组呢?
最佳答案
svd.cpp:
#include <julia.h>
#include <iostream>
#include <vector>
void print_vector(jl_array_t *vec) {
double *data = (double *) jl_array_data(vec);
size_t n = jl_array_dim(vec, 0);
for(int i = 0; i < n; ++i)
std::cout << data[i] << " ";
std::cout << std::endl;
}
// from column major vector
void print_2d_matrix(jl_array_t *mat) {
double *data = (double *) jl_array_data(mat);
size_t m = jl_array_dim(mat, 0);
size_t n = jl_array_dim(mat, 1);
for(int i = 0; i < m; ++i) {
for(int j = 0; j < n; ++j)
std::cout << data[i+j*m] << " ";
std::cout << std::endl;
}
}
int main() {
// matrix represented as a vector in column-major order
std::vector<double> mat = {
1, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0
};
// initialize Julia
jl_init(NULL);
jl_value_t* dims = (jl_value_t *) jl_eval_string("(4, 5)");
// make sure dims isn't cleaned up by the Julia gc till we're done with it.
JL_GC_PUSH(&dims);
// get the svd function
jl_function_t *svd = jl_get_function(jl_base_module, "svd");
// build a wrapper around the std::vector data to pass our matrix
// to the svd function
jl_value_t* array_type = jl_apply_array_type(jl_float64_type, 2);
jl_array_t *jl_mat = jl_ptr_to_array(array_type, mat.data(), dims, 0);
JL_GC_POP();
// call svd
jl_value_t *ret = jl_call1(svd, (jl_value_t*)jl_mat);
// make sure we don't lose our return data
JL_GC_PUSH1(&ret);
jl_array_t *jl_U = (jl_array_t*)(jl_fieldref(ret, 0));
jl_array_t *jl_S = (jl_array_t*)(jl_fieldref(ret, 1));
jl_array_t *jl_V = (jl_array_t*)(jl_fieldref(ret, 2));
std::cout << "M: " << std::endl;
print_2d_matrix(jl_mat);
std::cout << "U: " << std::endl;
print_2d_matrix(jl_U);
std::cout << "S: " << std::endl;
print_vector(jl_S);
std::cout << "V: " << std::endl;
print_2d_matrix(jl_V);
JL_GC_POP();
jl_atexit_hook(0);
return 0;
}
编译:
g++ -std=c++14 -fPIC -I$HOME/local/include/julia svd.cpp -L$HOME/local/lib/julia -ljulia
运行:
LD_LIBRARY_PATH=$HOME/local/lib/julia JULIA_HOME=$HOME/local/bin ./a.out
输出:
M:
1 0 0 0 2
0 0 3 0 0
0 0 0 0 0
0 2 0 0 0
U:
0 1 0 0
1 0 0 0
0 0 0 -1
0 0 1 0
S:
3 2.23607 2 0
V:
-0 0.447214 -0 0
0 0 1 0
1 0 0 0
-0 0 -0 1
0 0.894427 0 0
Julia 输出:
_
_ _ _(_)_ | A fresh approach to technical computing
(_) | (_) (_) | Documentation: http://docs.julialang.org
_ _ _| |_ __ _ | Type "?help" for help.
| | | | | | |/ _` | |
| | |_| | | | (_| | | Version 0.4.6 (2016-06-19 17:16 UTC)
_/ |\__'_|_|_|\__'_| |
|__/ | x86_64-redhat-linux
julia> mat = [1 0 0 0 2; 0 0 3 0 0; 0 0 0 0 0; 0 2 0 0 0]
4x5 Array{Int64,2}:
1 0 0 0 2
0 0 3 0 0
0 0 0 0 0
0 2 0 0 0
julia> svd(mat)
(
4x4 Array{Float64,2}:
0.0 1.0 0.0 0.0
1.0 0.0 0.0 0.0
0.0 0.0 0.0 -1.0
0.0 0.0 1.0 0.0,
[3.0,2.23606797749979,2.0,0.0],
5x4 Array{Float64,2}:
-0.0 0.447214 -0.0 0.0
0.0 0.0 1.0 0.0
1.0 0.0 0.0 0.0
-0.0 0.0 -0.0 1.0
0.0 0.894427 0.0 0.0)
julia>
关于c++ - 从 C++ 调用 Julia SVD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37913625/
SciPy 和 Numpy 都内置了奇异值分解 (SVD) 函数。命令基本上是 scipy.linalg.svd 和 numpy.linalg.svd。这两者有什么区别?它们中的任何一个都比另一个更好
numpy.linalg.svd 函数给出输入矩阵的完整 svd。但是我只想要第一个奇异向量。 我想知道在 numpy 中是否有任何函数用于那个或 python 中的任何其他库? 最佳答案 一种可能是
代码: import numpy from matplotlib.mlab import PCA file_name = "store1_pca_matrix.txt" ori_data = nump
我在学习SVD通过关注这个 MIT course . 矩阵构造为 C = np.matrix([[5,5],[-1,7]]) C matrix([[ 5, 5], [-1, 7]]
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
我想计算 SVD ,但我没有找到合适的 java 库。现在,我在 hashmap 中存储了数据,因为矩阵不适合内存,因为大小约为 400 000 X 10 000 并且大多数为 0。我尝试了 MTJ、
运行以下代码: from sklearn.decomposition import TruncatedSVD import numpy as np X = np.matrix('1 2 3 4 5;
给定一个实数矩阵 A 使得: A 是对称的 所有非对角线项都是已知且正的 所有对角线项都缺失 排名k 我想找到 A 的最佳可能完成,称为 Ac,这样(大约)rank(Ac)=k。 矩阵 A 可能很大(
我正在寻找一个执行维基百科中描述的奇异值分解的 Java 库:从矩阵 A (m X n) 得到 A = U*S*V' 其中 U 是 m x m,S 是 m x n,V 是n x n. 谁能帮帮我? 请
我正在尝试学习用于图像处理的 SVD...例如压缩。 我的方法:使用 ImageIO 获取图像作为 BufferedImage...获取 RGB 值并使用它们获取等效的灰度值(在 0-255 范围内)
我必须在 Matlab 中使用 SVD 来获得数据的简化版本。我读到函数 svds(X,k) 执行 SVD 并返回前 k 个特征值和特征向量。如果必须规范化数据,文档中没有提及。对于归一化,我指的是减
我已经使用 SVD 找到了两组点之间的旋转矩阵。我知道 R = Transpose(U) * V 但我不明白 U 和 V 代表什么以及为什么这种乘法会产生旋转矩阵。 最佳答案 由于您的问题是理论性的并
我正在尝试在名为“LSA 简介”的论文中复制一个示例: An introduction to LSA 在示例中,它们具有以下术语-文档矩阵: 然后他们应用 SVD 并得到以下结果: 试图复制这一点,我
我正在使用带有 R 的 SVD 包,我能够通过将最低奇异值替换为 0 来降低矩阵的维数。但是当我重新组合矩阵时,我仍然拥有相同数量的特征,我找不到如何有效地删除源矩阵中最无用的特征,以减少其列数。 例
我想编写一个函数,它使用 SVD 分解来求解方程组 ax=b,其中 a 是一个方阵,b 是一个值向量。 scipy 函数 scipy.linalg.svd() 应该将 a 转换为矩阵 U W V。对于
我在 R 中有一个稀疏矩阵,它显然太大了,无法在其上运行 as.matrix()(尽管它也不是 super 大)。有问题的 as.matrix() 调用位于 svd() 函数内部,所以我想知道是否有人
我正在尝试使用 bcv 包中的 SVD 插补,但所有插补值都是相同的(按列)。 这是缺少数据的数据集 http://pastebin.com/YS9qaUPs #load data dataMiss
我有这个数组 double a[][] = {{1,1,1}, {0,1,1} , { 1,0,0} ,{0,1,0},{1,0,0},{1,0,1},{1,1,1},{1,1,1},
我们现在知道A_(m x n) = U_(m x k) * S_(k x k) * V_(k x n)^T = u_(1) * s_1 * v_(1) + u_(2) * s_2 * v_(2) +
我必须对矩阵进行 SVD,但它有一些错误,在下面的示例中 U[1][1]、U[2][1] 和 U[2][0] 应为 0。 问题是,上面的例子只是一个测试,我必须使用条件不太好的大型矩阵,我该怎么做才能
我是一名优秀的程序员,十分优秀!