All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.ejml.alg.block.BlockInnerMultiplication Maven / Gradle / Ivy

Go to download

A fast and easy to use dense matrix linear algebra library written in Java.

There is a newer version: 0.25
Show newest version
/*
 * Copyright (c) 2009-2012, Peter Abeles. All Rights Reserved.
 *
 * This file is part of Efficient Java Matrix Library (EJML).
 *
 * EJML is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3
 * of the License, or (at your option) any later version.
 *
 * EJML is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with EJML.  If not, see .
 */

package org.ejml.alg.block;

/**
 * 

* Matrix multiplication for the inner row major blocks, typically inside of a {@link org.ejml.data.BlockMatrix64F}. *

* *

* This code was auto generated by {@link GeneratorBlockInnerMultiplication} and should not be modified directly. *

* * @author Peter Abeles */ public class BlockInnerMultiplication { /** *

* Performs the follow operation on individual inner blocks:
*
* C = C + A * B *

*/ public static void blockMultPlus( final double[] dataA, final double []dataB, final double []dataC, int indexA, int indexB, int indexC, final int heightA, final int widthA, final int widthC) { // for( int i = 0; i < heightA; i++ ) { // for( int k = 0; k < widthA; k++ ) { // for( int j = 0; j < widthC; j++ ) { // dataC[ i*widthC + j + indexC ] += dataA[i*widthA + k + indexA] * dataB[k*widthC + j + indexB]; // } // } // } int a = indexA; int rowC = indexC; for( int i = 0; i < heightA; i++ , rowC += widthC ) { int b = indexB; final int endC = rowC + widthC; final int endA = a + widthA; while( a != endA ) {//for( int k = 0; k < widthA; k++ ) { double valA = dataA[a++]; int c = rowC; while( c != endC ) {//for( int j = 0; j < widthC; j++ ) { dataC[ c++ ] += valA * dataB[ b++ ]; } } } } /** *

* Performs the follow operation on individual inner blocks:
*
* C = C + AT * B *

*/ public static void blockMultPlusTransA( final double[] dataA, final double []dataB, final double []dataC, int indexA, int indexB, int indexC, final int heightA, final int widthA, final int widthC) { // for( int i = 0; i < widthA; i++ ) { // for( int k = 0; k < heightA; k++ ) { // double valA = dataA[k*widthA + i + indexA]; // for( int j = 0; j < widthC; j++ ) { // dataC[ i*widthC + j + indexC ] += valA * dataB[k*widthC + j + indexB]; // } // } // } int rowC = indexC; for( int i = 0; i < widthA; i++ , rowC += widthC) { int colA = i + indexA; int endA = colA + widthA*heightA; int b = indexB; // for( int k = 0; k < heightA; k++ ) { while(colA != endA ) { double valA = dataA[colA]; int c = rowC; final int endB = b + widthC; //for( int j = 0; j < widthC; j++ ) { while( b != endB ) { dataC[ c++ ] += valA * dataB[b++]; } colA += widthA; } } } /** *

* Performs the follow operation on individual inner blocks:
*
* C = C + A * BT *

*/ public static void blockMultPlusTransB( final double[] dataA, final double []dataB, final double []dataC, int indexA, int indexB, int indexC, final int heightA, final int widthA, final int widthC) { for( int i = 0; i < heightA; i++ ) { for( int j = 0; j < widthC; j++ ) { double val = 0; for( int k = 0; k < widthA; k++ ) { val += dataA[i*widthA + k + indexA] * dataB[j*widthA + k + indexB]; } dataC[ i*widthC + j + indexC ] += val; } } } /** *

* Performs the follow operation on individual inner blocks:
*
* C = C - A * B *

*/ public static void blockMultMinus( final double[] dataA, final double []dataB, final double []dataC, int indexA, int indexB, int indexC, final int heightA, final int widthA, final int widthC) { // for( int i = 0; i < heightA; i++ ) { // for( int k = 0; k < widthA; k++ ) { // for( int j = 0; j < widthC; j++ ) { // dataC[ i*widthC + j + indexC ] += dataA[i*widthA + k + indexA] * dataB[k*widthC + j + indexB]; // } // } // } int a = indexA; int rowC = indexC; for( int i = 0; i < heightA; i++ , rowC += widthC ) { int b = indexB; final int endC = rowC + widthC; final int endA = a + widthA; while( a != endA ) {//for( int k = 0; k < widthA; k++ ) { double valA = dataA[a++]; int c = rowC; while( c != endC ) {//for( int j = 0; j < widthC; j++ ) { dataC[ c++ ] -= valA * dataB[ b++ ]; } } } } /** *

* Performs the follow operation on individual inner blocks:
*
* C = C - AT * B *

*/ public static void blockMultMinusTransA( final double[] dataA, final double []dataB, final double []dataC, int indexA, int indexB, int indexC, final int heightA, final int widthA, final int widthC) { // for( int i = 0; i < widthA; i++ ) { // for( int k = 0; k < heightA; k++ ) { // double valA = dataA[k*widthA + i + indexA]; // for( int j = 0; j < widthC; j++ ) { // dataC[ i*widthC + j + indexC ] += valA * dataB[k*widthC + j + indexB]; // } // } // } int rowC = indexC; for( int i = 0; i < widthA; i++ , rowC += widthC) { int colA = i + indexA; int endA = colA + widthA*heightA; int b = indexB; // for( int k = 0; k < heightA; k++ ) { while(colA != endA ) { double valA = dataA[colA]; int c = rowC; final int endB = b + widthC; //for( int j = 0; j < widthC; j++ ) { while( b != endB ) { dataC[ c++ ] -= valA * dataB[b++]; } colA += widthA; } } } /** *

* Performs the follow operation on individual inner blocks:
*
* C = C - A * BT *

*/ public static void blockMultMinusTransB( final double[] dataA, final double []dataB, final double []dataC, int indexA, int indexB, int indexC, final int heightA, final int widthA, final int widthC) { for( int i = 0; i < heightA; i++ ) { for( int j = 0; j < widthC; j++ ) { double val = 0; for( int k = 0; k < widthA; k++ ) { val += dataA[i*widthA + k + indexA] * dataB[j*widthA + k + indexB]; } dataC[ i*widthC + j + indexC ] -= val; } } } /** *

* Performs the follow operation on individual inner blocks:
*
* C = A * B *

*/ public static void blockMultSet( final double[] dataA, final double []dataB, final double []dataC, int indexA, int indexB, int indexC, final int heightA, final int widthA, final int widthC) { // for( int i = 0; i < heightA; i++ ) { // for( int k = 0; k < widthA; k++ ) { // for( int j = 0; j < widthC; j++ ) { // dataC[ i*widthC + j + indexC ] += dataA[i*widthA + k + indexA] * dataB[k*widthC + j + indexB]; // } // } // } int a = indexA; int rowC = indexC; for( int i = 0; i < heightA; i++ , rowC += widthC ) { int b = indexB; final int endC = rowC + widthC; final int endA = a + widthA; while( a != endA ) {//for( int k = 0; k < widthA; k++ ) { double valA = dataA[a++]; int c = rowC; if( b == indexB ) { while( c != endC ) {//for( int j = 0; j < widthC; j++ ) { dataC[ c++ ] = valA * dataB[ b++ ]; } } else { while( c != endC ) {//for( int j = 0; j < widthC; j++ ) { dataC[ c++ ] += valA * dataB[ b++ ]; } } } } } /** *

* Performs the follow operation on individual inner blocks:
*
* C = AT * B *

*/ public static void blockMultSetTransA( final double[] dataA, final double []dataB, final double []dataC, int indexA, int indexB, int indexC, final int heightA, final int widthA, final int widthC) { // for( int i = 0; i < widthA; i++ ) { // for( int k = 0; k < heightA; k++ ) { // double valA = dataA[k*widthA + i + indexA]; // for( int j = 0; j < widthC; j++ ) { // dataC[ i*widthC + j + indexC ] += valA * dataB[k*widthC + j + indexB]; // } // } // } int rowC = indexC; for( int i = 0; i < widthA; i++ , rowC += widthC) { int colA = i + indexA; int endA = colA + widthA*heightA; int b = indexB; // for( int k = 0; k < heightA; k++ ) { while(colA != endA ) { double valA = dataA[colA]; int c = rowC; final int endB = b + widthC; //for( int j = 0; j < widthC; j++ ) { if( b == indexB ) { while( b != endB ) { dataC[ c++ ] = valA * dataB[b++]; } } else { while( b != endB ) { dataC[ c++ ] += valA * dataB[b++]; } } colA += widthA; } } } /** *

* Performs the follow operation on individual inner blocks:
*
* C = A * BT *

*/ public static void blockMultSetTransB( final double[] dataA, final double []dataB, final double []dataC, int indexA, int indexB, int indexC, final int heightA, final int widthA, final int widthC) { for( int i = 0; i < heightA; i++ ) { for( int j = 0; j < widthC; j++ ) { double val = 0; for( int k = 0; k < widthA; k++ ) { val += dataA[i*widthA + k + indexA] * dataB[j*widthA + k + indexB]; } dataC[ i*widthC + j + indexC ] = val; } } } /** *

* Performs the follow operation on individual inner blocks:
*
* C = C + α A * B *

*/ public static void blockMultPlus( double alpha , final double[] dataA, final double []dataB, final double []dataC, int indexA, int indexB, int indexC, final int heightA, final int widthA, final int widthC) { // for( int i = 0; i < heightA; i++ ) { // for( int k = 0; k < widthA; k++ ) { // for( int j = 0; j < widthC; j++ ) { // dataC[ i*widthC + j + indexC ] += dataA[i*widthA + k + indexA] * dataB[k*widthC + j + indexB]; // } // } // } int a = indexA; int rowC = indexC; for( int i = 0; i < heightA; i++ , rowC += widthC ) { int b = indexB; final int endC = rowC + widthC; final int endA = a + widthA; while( a != endA ) {//for( int k = 0; k < widthA; k++ ) { double valA = alpha*dataA[a++]; int c = rowC; while( c != endC ) {//for( int j = 0; j < widthC; j++ ) { dataC[ c++ ] += valA * dataB[ b++ ]; } } } } /** *

* Performs the follow operation on individual inner blocks:
*
* C = C + α AT * B *

*/ public static void blockMultPlusTransA( double alpha , final double[] dataA, final double []dataB, final double []dataC, int indexA, int indexB, int indexC, final int heightA, final int widthA, final int widthC) { // for( int i = 0; i < widthA; i++ ) { // for( int k = 0; k < heightA; k++ ) { // double valA = dataA[k*widthA + i + indexA]; // for( int j = 0; j < widthC; j++ ) { // dataC[ i*widthC + j + indexC ] += valA * dataB[k*widthC + j + indexB]; // } // } // } int rowC = indexC; for( int i = 0; i < widthA; i++ , rowC += widthC) { int colA = i + indexA; int endA = colA + widthA*heightA; int b = indexB; // for( int k = 0; k < heightA; k++ ) { while(colA != endA ) { double valA = alpha*dataA[colA]; int c = rowC; final int endB = b + widthC; //for( int j = 0; j < widthC; j++ ) { while( b != endB ) { dataC[ c++ ] += valA * dataB[b++]; } colA += widthA; } } } /** *

* Performs the follow operation on individual inner blocks:
*
* C = C + α A * BT *

*/ public static void blockMultPlusTransB( double alpha , final double[] dataA, final double []dataB, final double []dataC, int indexA, int indexB, int indexC, final int heightA, final int widthA, final int widthC) { for( int i = 0; i < heightA; i++ ) { for( int j = 0; j < widthC; j++ ) { double val = 0; for( int k = 0; k < widthA; k++ ) { val += dataA[i*widthA + k + indexA] * dataB[j*widthA + k + indexB]; } dataC[ i*widthC + j + indexC ] += alpha * val; } } } /** *

* Performs the follow operation on individual inner blocks:
*
* C = α A * B *

*/ public static void blockMultSet( double alpha , final double[] dataA, final double []dataB, final double []dataC, int indexA, int indexB, int indexC, final int heightA, final int widthA, final int widthC) { // for( int i = 0; i < heightA; i++ ) { // for( int k = 0; k < widthA; k++ ) { // for( int j = 0; j < widthC; j++ ) { // dataC[ i*widthC + j + indexC ] += dataA[i*widthA + k + indexA] * dataB[k*widthC + j + indexB]; // } // } // } int a = indexA; int rowC = indexC; for( int i = 0; i < heightA; i++ , rowC += widthC ) { int b = indexB; final int endC = rowC + widthC; final int endA = a + widthA; while( a != endA ) {//for( int k = 0; k < widthA; k++ ) { double valA = alpha*dataA[a++]; int c = rowC; if( b == indexB ) { while( c != endC ) {//for( int j = 0; j < widthC; j++ ) { dataC[ c++ ] = valA * dataB[ b++ ]; } } else { while( c != endC ) {//for( int j = 0; j < widthC; j++ ) { dataC[ c++ ] += valA * dataB[ b++ ]; } } } } } /** *

* Performs the follow operation on individual inner blocks:
*
* C = α AT * B *

*/ public static void blockMultSetTransA( double alpha , final double[] dataA, final double []dataB, final double []dataC, int indexA, int indexB, int indexC, final int heightA, final int widthA, final int widthC) { // for( int i = 0; i < widthA; i++ ) { // for( int k = 0; k < heightA; k++ ) { // double valA = dataA[k*widthA + i + indexA]; // for( int j = 0; j < widthC; j++ ) { // dataC[ i*widthC + j + indexC ] += valA * dataB[k*widthC + j + indexB]; // } // } // } int rowC = indexC; for( int i = 0; i < widthA; i++ , rowC += widthC) { int colA = i + indexA; int endA = colA + widthA*heightA; int b = indexB; // for( int k = 0; k < heightA; k++ ) { while(colA != endA ) { double valA = alpha*dataA[colA]; int c = rowC; final int endB = b + widthC; //for( int j = 0; j < widthC; j++ ) { if( b == indexB ) { while( b != endB ) { dataC[ c++ ] = valA * dataB[b++]; } } else { while( b != endB ) { dataC[ c++ ] += valA * dataB[b++]; } } colA += widthA; } } } /** *

* Performs the follow operation on individual inner blocks:
*
* C = α A * BT *

*/ public static void blockMultSetTransB( double alpha , final double[] dataA, final double []dataB, final double []dataC, int indexA, int indexB, int indexC, final int heightA, final int widthA, final int widthC) { for( int i = 0; i < heightA; i++ ) { for( int j = 0; j < widthC; j++ ) { double val = 0; for( int k = 0; k < widthA; k++ ) { val += dataA[i*widthA + k + indexA] * dataB[j*widthA + k + indexB]; } dataC[ i*widthC + j + indexC ] = alpha * val; } } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy