Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获得了90%的JavaScript代码-can';我想不出还有什么_Javascript_Function_Math_Matrix_Linear Algebra - Fatal编程技术网

获得了90%的JavaScript代码-can';我想不出还有什么

获得了90%的JavaScript代码-can';我想不出还有什么,javascript,function,math,matrix,linear-algebra,Javascript,Function,Math,Matrix,Linear Algebra,所以我尝试为任意大小的N×N矩阵建模,我正式遇到了一个无法逾越的障碍。我知道这是一个正确循环的问题,但我不知道问题出在哪里。记住,我不想只传入一个3×3的矩阵,而是任意大小的N×N 课程笔记准确地解释了我想做什么。顺便说一下,计算起来很简单。在课程笔记中,“u”表示元素的平方和,因此为sqrt(x12+x22+x32+…+xn2) 乘法符号实际上是点积 下面列出了到目前为止我编写的代码。怎么了 function qrProjection(arr) { var qProjected = [

所以我尝试为任意大小的N×N矩阵建模,我正式遇到了一个无法逾越的障碍。我知道这是一个正确循环的问题,但我不知道问题出在哪里。记住,我不想只传入一个3×3的矩阵,而是任意大小的N×N

课程笔记准确地解释了我想做什么。顺便说一下,计算起来很简单。在课程笔记中,“u”表示元素的平方和,因此为sqrt(x12+x22+x32+…+xn2)

乘法符号实际上是点积

下面列出了到目前为止我编写的代码。怎么了

function qrProjection(arr) {
    var qProjected = [];
    var tempArray = [];
    var aTemp = arr;
    var uTemp = new Array(arr.length);
    var uSquareSqrt = new Array(arr.length);
    var eTemp = [];
    var sum = 0;
    var sumOfSquares = 0;
    var breakCondition = 0;
    var secondBreakCondition = 0;
    var iterationCounter = 0;

    //Build uTemp Array
    for (i = 0; i < arr.length; i++) {
        uTemp[i] = new Array(arr[i].length);
    }
    for (i = 0; i < arr.length; i++) {
        eTemp[i] = new Array(arr[i].length);
    }

    uTemp[0] = aTemp[0];

    for (j = 0; j <= arr.length; j++) {

        for (l = 0; l < arr[j].length; l++) {
            if (breakCondition == 1) break;
            sumOfSquares = Math.pow(uTemp[j][l], 2) + sumOfSquares;
        }

        if (breakCondition == 0) {
            uSquareSqrt[j] = Math.sqrt(sumOfSquares);
            sumOfSquares = 0;
        }

        for (i = 0; i < arr[j].length; i++) {
            if (breakCondition == 1) break;
            eTemp[j][i] = (1 / (uSquareSqrt[j])) * (uTemp[j][i]);
        }

        breakCondition = 1;

        if (iterationCounter == 0) {
            for (m = 0; m < arr[j].length; m++) {
                matrixDotProduct = aTemp[j + 1][m] * eTemp[j][m] + matrixDotProduct;
            }
        }
        else {
            for (m = 0; m < arr[j].length; m++) {
                for (s = 0; s <= iterationCounter; s++) {

                    matrixDotProduct = aTemp[j + 1][s] * eTemp[m][s] + matrixDotProduct;
                }
                for (t = 0; t < arr[j].length; t++) {
                    uTemp[j + 1][t] = aTemp[j + 1][t] - eTemp[j][t] * matrixDotProduct;

                }
            }
        }

        if (iterationCounter == 0) {
            for (m = 0; m < arr[j].length; m++) {
                uTemp[j + 1][m] = aTemp[j + 1][m] - eTemp[j][m] * matrixDotProduct;
            }
        }

        matrixDotProduct = 0;

        for (l = 0; l < arr[j].length; l++) {
            sumOfSquares = Math.pow(uTemp[j + 1][l], 2) + sumOfSquares;
        }

        uSquareSqrt[j + 1] = Math.sqrt(sumOfSquares);
        sumOfSquares = 0;

        for (i = 0; i < arr[j].length; i++) {
            eTemp[j + 1][i] = (1 / (uSquareSqrt[j + 1])) * (uTemp[j + 1][i]);
        }

        iterationCounter++;
    }
    qProjected = eTemp;
    return qProjected;
}
功能QR投影(arr){
var qProjected=[];
var tempArray=[];
var-aTemp=arr;
var uTemp=新数组(arr.length);
var uSquareSqrt=新阵列(阵列长度);
var-eTemp=[];
var总和=0;
var sumOfSquares=0;
var-breakCondition=0;
var secondBreakCondition=0;
var迭代计数器=0;
//构建uTemp阵列
对于(i=0;i对于(j=0;j我必须道歉,我没有修改您的代码,而是从头开始编写了自己的代码:

/* Main function of interest */

// Each entry of a matrix object represents a column
function gramSchmidt(matrixA, n) {        
    var totalVectors = matrixA.length;

    for (var i = 0; i < totalVectors; i++) {
        var tempVector = matrixA[i];
        for (var j = 0; j < i; j++) {
            var dotProd = dot(matrixA[i], matrixA[j], n);
            var toSubtract = multiply(dotProd, matrixA[j], n);
            tempVector = subtract(tempVector, toSubtract, n);
        }
        var nrm = norm(tempVector, n);
        matrixA[i] = multiply(1 / nrm, tempVector, n);
    }
}

/*
 * Example usage:
 * var myMatrix = [[1,0,0],[2,3,0],[5,4,7]];
 * gramSchmidt(myMatrix, 3);
 *   ==> myMatrix now equals [[1,0,0],[0,1,0],[0,0,1]]
 * 3 here equals the number of dimensions per vector
 */


/* Simple vector arithmetic */

function subtract(vectorX, vectorY, n) {
    var result = new Array(n);
    for (var i = 0; i < n; i++)
        result[i] = vectorX[i] - vectorY[i];
    return result;
}

function multiply(scalarC, vectorX, n) {
    var result = new Array(n);
    for (var i = 0; i < n; i++)
        result[i] = scalarC * vectorX[i];
    return result;
}

function dot(vectorX, vectorY, n) {
    var sum = 0;
    for (var i = 0; i < n; i++)
        sum += vectorX[i] * vectorY[i];
    return sum;
}

function norm(vectorX, n) {
    return Math.sqrt(dot(vectorX, vectorX, n));
}
/*感兴趣的主要功能*/
//矩阵对象的每个条目表示一列
函数gramSchmidt(matrixA,n){
var totalVectors=矩阵长度;
对于(变量i=0;imyMatrix现在等于[[1,0,0],[0,1,0],[0,0,1]]
*这里的3等于每个向量的维数
*/
/*简单向量算法*/
函数减法(向量,向量,n){
var结果=新数组(n);
对于(变量i=0;i

请注意,上面的算法计算Gram-Schmidt正交化,即矩阵[e1 | e2 |…| en],而不是QR分解!

首先,您拥有的每个
For()
语句都必须在某个地方有一个var声明。例如
For(var i=0;i
@Lance不需要在没有var的情况下初始化变量,代码仍然可以工作。也就是说,所有变量都是全局变量,而不是局部变量,因此不使用var被认为是非常不好的做法。很酷,谢谢各位,我将为我使用的所有I、j、m、l等变量添加var。很高兴知道这一点。非常感谢。为了减少代码和增加可读性,注意表达式
sum=x+sum;
可以写成
sum+=x;
。哇,谢谢你,真的很感激。是的,通过[e1,e2,…en]矩阵,我可以把QR分解组合在一起。让我大吃一惊的部分是u(k+1)几学期前,当我学习线性代数时,我一直在对自己说,“除了高斯消去法,我不会使用任何其他的废话。”然后我发现自己翻开我的旧书,试图弄清楚如何在里面编程。再一次,再次感谢。我希望你能理解我的代码,并能够反映一些关于你自己代码中使用的结构和变量的信息。我理解,谢谢。我最熟悉MatLab(我的工程使用)因此,我显然没有很好的编程基础,但你的帖子极大地帮助我理解了应该如何进行。似乎最好的方法是使用带有易于理解的变量的短函数进行调试/跟踪。再次感谢你编写的主函数“gramSchmidt”不起作用,当(var j=0;…)的循环进行时,不确定循环的目标是什么。MatrixE[j]没有为j=1,2,3时定义……因为这是我们正在寻找的。我正在尝试修复您的代码,看看是否可以让它起作用。如果您错过了什么,并且没有发布它,请告诉我:)我测试了我的代码,我很确定它是正确的。包含
j
的循环执行减去
(a[I]dote e[j])*e[j]
的任务
是在
j
时定义的。我尝试将代码的结构尽可能类似于您的PDF。顺便说一句,请在解决原始问题后接受最后的答案。