# v_rotqr2mr

## PURPOSE

V_ROTQR2MR converts a matrix of real quaternion vectors to quaternion matrices

## SYNOPSIS

function mr=v_rotqr2mr(qr)

## DESCRIPTION

    V_ROTQR2MR converts a matrix of real quaternion vectors to quaternion matrices
     Inputs:

         QR(4m,n,...)   mxn matrix of real quaternion vectors (each 4x1)

     Outputs:

         MR(4m,4n,...)   mxn matrix of real quaternion matrices (each 4x4)

     In matrix form, quaternions can be multiplied and added using normal matrix
     arithmetic. Each element of an mxn matrix of quaternions is itself a 4x4 block
     so the total dimension of MR is 4m x 4n.

## CROSS-REFERENCE INFORMATION

This function calls:

- v_rotqr2ro ROTQR2RO converts a real quaternion to a 3x3 rotation matrix

This function is called by:

- v_qrmult V_QRMULT multiplies together two real quaternions matrices q=[q1,q2]

## SOURCE CODE

    0001 function mr=v_rotqr2mr(qr)
    0002 %V_ROTQR2MR converts a matrix of real quaternion vectors to quaternion matrices
    0003 % Inputs:
    0004 %
    0005 %     QR(4m,n,...)   mxn matrix of real quaternion vectors (each 4x1)
    0006 %
    0007 % Outputs:
    0008 %
    0009 %     MR(4m,4n,...)   mxn matrix of real quaternion matrices (each 4x4)
    0010 %
    0011 % In matrix form, quaternions can be multiplied and added using normal matrix
    0012 % arithmetic. Each element of an mxn matrix of quaternions is itself a 4x4 block
    0013 % so the total dimension of MR is 4m x 4n.
    0014
    0015 %
    0016 %      Copyright (C) Mike Brookes 2000-2018
    0017 %      Version: $Id: v_rotqr2mr.m 10865 2018-09-21 17:22:45Z dmb $
    0018 %
    0019 %   VOICEBOX is a MATLAB toolbox for speech processing.
    0020 %   Home page: http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html
    0021 %
    0022 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    0023 %   This program is free software; you can redistribute it and/or modify
    0024 %   it under the terms of the GNU Lesser General Public License as published by
    0025 %   the Free Software Foundation; either version 3 of the License, or
    0026 %   (at your option) any later version.
    0027 %
    0028 %   This program is distributed in the hope that it will be useful,
    0029 %   but WITHOUT ANY WARRANTY; without even the implied warranty of
    0030 %   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    0031 %   GNU Lesser General Public License for more details.
    0032 %
    0033 %   You can obtain a copy of the GNU Lesser General Public License from
    0034 %   https://www.gnu.org/licenses/ .
    0035 %
    0036 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    0037 persistent a b c
    0038 if isempty(a)
    0039     a=[1 2 3 3 1 2];    % destination row of +ve entries (from 0)
    0040     b=[1 2 3 2 3 1];    % destination col of +ve entries (from 0)
    0041     c=[0 0 0 1 2 3];    % source row of +ve entries (from 0)
    0042 end
    0043 s=size(qr);
    0044 m=s(1);
    0045 mr=repmat(reshape(qr,s(1),[]),4,1);
    0046 n=size(mr,2);
    0047 mn=s(1)*n;
    0048 j=repmat(4*m*(0:n-1),m/4,1);
    0049 i=repmat((1:4:m)',n,1)+j(:);
    0050 ni=length(i);
    0051 i6=repmat(i,1,6);
    0052 mr(i6+repmat(a+m*b,ni,1))=mr(i6+repmat(c,ni,1));
    0053 mr(i6+repmat(c+m*b,ni,1))=-mr(i6+repmat(a,ni,1));
    0054 s(2)=4*s(2); % output array size
    0055 mr=reshape(mr,s);
    0056 if ~nargout
    0057     qr=qr(1:4);
    0058     v_rotqr2ro(qr(:)); % plot a rotated cube
    0059 end