Mercurial > hg > ltpda
diff m-toolbox/classes/@ssm/getMatrixSelection.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/classes/@ssm/getMatrixSelection.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,124 @@ +% GETMATRIXSELECTIONS allows to select data in a block-defined matrix +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: GETMATRIXSELECTIONS allows to select data in a +% block-defined matrix with user i/o selection, and i/o data selection. +% Permuations matrices are returned +% +% CALL: [ao_out pl_out] = getModelMatrixSelection(sys, plist_inputs) +% +% INPUTS: +% +% OUTPUTS: +% +% <a href="matlab:utils.helper.displayMethodInfo('ssm', 'getModelMatrixSelection')">Parameters Description</a> +% +% VERSION: $Id: getMatrixSelection.m,v 1.5 2011/04/08 08:56:23 hewitson Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function varargout = getMatrixSelection(blockMat, oldColumns, newColumns, oldRows, newRows) + error('This function is deprecated, it will be modified or removed. Use double instead.') + utils.helper.msg(utils.const.msg.MNAME, ['running ', mfilename]); + + %% making indexes out of i/o data + indexInputsIn = makePortIndex( oldColumns, newColumns ); + colSizesIn = getsizes(indexInputsIn); + colSizes = oldColumns.Nports; + + indexOutputsOut = makePortIndex( oldRows, newRows ); + rowSizesOut = getsizes(indexOutputsOut); + rowSizes = oldRows.Nports; + + %% pruning ssmBlocks + inputNamesFull = getcellstr(oldColumns, colSizes); + inputsIn = blocksPrune(oldColumns, indexInputsIn); + inputNames = getcellstr(inputsIn, colSizesIn); + inputUnits = getUnit(inputsIn, colSizesIn); + + outputNamesFull = getcellstr(oldRows, rowSizes); + outputsOut = blocksPrune(oldRows, indexOutputsOut); + outputNames = getcellstr(outputsOut, rowSizesOut); + outputUnits = getUnit(outputsOut, rowSizesOut); + + %% pruning matrix and turning it to a double + A = ssm.blockMatFusion( blockMat, rowSizes, colSizes); + + %% finding input and output variable positions of data in option plists + + if ischar(newColumns) && strcmp(newColumns, 'ALL') %case 'ALL' 'NONE' + inputsConv = eye(sum(colSizes),sum(colSizes)); + elseif ischar(newColumns) && strcmp(newColumns, 'NONE') %case 'NONE' + inputsConv = eye(sum(colSizes),0); + else + if ischar(newColumns) + newColumns = {newColumns}; + end + NinputsIn = numel(newColumns); + Ninputs = sum(colSizes); + inputsConv = zeros(Ninputs,NinputsIn); + for i=1:NinputsIn + position = reshape( strcmpi(inputNamesFull, newColumns{i}) , [Ninputs, 1]); + inputsConv(:,i) = double(position).'; + if sum(position)==0 + error(['No variable found named ', newColumns{i}]); + end + end + end + + %% finding input and output variable positions of data in option plists + + if ischar(newRows) && strcmp(newRows, 'ALL') %case 'ALL' 'NONE' + outputsConv = eye(sum(rowSizes),sum(rowSizes)); + elseif ischar(newRows) && strcmp(newRows, 'NONE') %case 'NONE' + outputsConv = eye(0,sum(rowSizes)); + else + if ischar(newRows) + newRows = {newRows}; + end + NoutputsOut = numel(newRows); + Noutputs = sum(rowSizes); + outputsConv = zeros(NoutputsOut,Noutputs); + for i=1:NoutputsOut + position = reshape( strcmpi(newRows{i}, outputNamesFull ) , [1, Noutputs]); + outputsConv(i,:) = double(position); + if sum(position)==0 + error(['No variable found named ', newRows{i}]); + end + end + end + + %% parsing output matrices + varargout = {A, inputsConv, outputsConv, inputNames, outputNames, inputUnits, outputUnits}; +end + +function sizes = getsizes(idx) + sizes = zeros(1, numel(idx)); + for i=1:numel(idx) + sizes(i) = sum(idx{i}); + end +end + +function names = getcellstr(block, sizes) + names = cell(1, sum(sizes)); + k = 1; + for i=1:numel(block) + for j=1:sizes(i) + names{k} = block(i).ports(j).name; + k = k+1; + end + end +end + +function units = getUnit(block, sizes) + units = unit.initObjectWithSize(1, sum(sizes)); + k = 1; + for i=1:numel(block) + for j=1:sizes(i) + units(k) = block(i).ports(j).units; + k = k+1; + end + end +end + +