From 2ff1c3418f9557f18b76af9ada15247cfa025de7 Mon Sep 17 00:00:00 2001 From: neurolabusc Date: Sat, 8 Jun 2024 10:44:30 -0400 Subject: [PATCH] Save Matlab RBF model as NIfTI and decode with JavaScript --- main.js | 22 ++++++++++++++++++++++ public/mat2nii.m | 32 ++++++++++++++++++++++++++++++++ public/models_5x10_diff.nii.gz | Bin 0 -> 13343 bytes 3 files changed, 54 insertions(+) create mode 100644 public/mat2nii.m create mode 100644 public/models_5x10_diff.nii.gz diff --git a/main.js b/main.js index b30da81..3caf5c4 100644 --- a/main.js +++ b/main.js @@ -100,6 +100,28 @@ async function main() { nv1.attachToCanvas(gl1) const pca_coeff = (await nv1.loadFromUrl('./pca_values_coeff.nii.gz')).img const pca_mu = (await nv1.loadFromUrl('./pca_values_mu.nii.gz')).img + async function loadRBFmodel() { + const rbf = (await nv1.loadFromUrl('./models_5x10_diff.nii.gz')).img + let v = 0; + const nModels = rbf[v++] + const models = [] + for (let i = 0; i < nModels; i++) { + let model = {} + model.dim0 = rbf[v++] + model.dim1 = rbf[v++] + + model.bias_i = rbf[v++] + model.gamma_i = rbf[v++] + model.SVs = new Float64Array(model.dim0 * model.dim1) + for (let j = 0; j < (model.dim0 * model.dim1); j++) + model.SVs[j] = rbf[v++] + model.sv_coef = new Float64Array(model.dim0) + for (let j = 0; j < model.dim0; j++) + model.sv_coef[j] = rbf[v++] + models.push(model) + } + } + const models = await loadRBFmodel() nv1.opts.dragMode = nv1.dragModes.pan nv1.opts.multiplanarForceRender = true nv1.opts.yoke3Dto2DZoom = true diff --git a/public/mat2nii.m b/public/mat2nii.m new file mode 100644 index 0000000..1e1c7f4 --- /dev/null +++ b/public/mat2nii.m @@ -0,0 +1,32 @@ +function ma2nii +% convert model with Radial basis function kernels from matlab to NIfTI +% we could use JSON, but we want to retain precision + + +models = load('models_5x10_diff.mat').models; +% +v = 1; +nii(v) = numel(models); +v = v + 1; +for i = 1:numel(models) + nii(v) = size(models{i}.SVs,1); + v = v + 1; + nii(v) = size(models{i}.SVs,2); + v = v + 1; + nii(v) = - models{i}.rho; % bias_i + v = v + 1; + nii(v) = models{i}.Parameters(4); % gamma_i + v = v + 1; + for j = 1:numel(models{i}.SVs) + nii(v) = models{i}.SVs(j); % support_vectors_i + v = v + 1; + end + if (size(models{i}.SVs,1) ~= numel(models{i}.sv_coef)) + error('unexpected numel sv_coef'); + end + for j = 1:numel(models{i}.sv_coef) + nii(v) = models{i}.sv_coef(j); % coefficients_i + v = v + 1; + end +end +niftiwrite(nii,'models_5x10_diff.nii') diff --git a/public/models_5x10_diff.nii.gz b/public/models_5x10_diff.nii.gz new file mode 100644 index 0000000000000000000000000000000000000000..c2b5ed06568c6f21b0e8b89df4b056ce29363dca GIT binary patch literal 13343 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 SXRHc$offE<&g1|2=l=nR1+|j^ literal 0 HcmV?d00001