How can i use multimatrix in a loop in OpenSCAD? - openscad

i wish to chain cubes end to end inside a loop, so that i can construct a spiral made of cubes only using dynamic rules of how they are added together rather than a parametric equation. i.e. translate 1, tilt 20', rotate-z 10'... would make a 3d spirograph.
Here is an example file using openscad recursion (which memory-crashes very fast compared to openscad loops) i wish to do the same using a loop? i am confused.
levels = 50; // number of levels for the recursion
len = 100; // length of the first segment
thickness = 5; // thickness of the first segment
// the identity matrix
identity = [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ] ];
// random generator
function rnd(s, e) = rands(s, e, 1)[0];
// generate 4x4 translation matrix
function mt(x, y) = [ [ 1, 0, 0, x ], [ 0, 1, 0, y ], [ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ] ];
// generate 4x4 rotation matrix around Z axis
function mr(a) = [ [ cos(a), -sin(a), 0, 0 ], [ sin(a), cos(a), 0, 0 ], [ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ] ];
module tree(length, thickness, count, m = identity) {
color([0, 1 - (0.8 / levels * count), 0])
multmatrix(m)
cube([thickness, length, thickness]);
if (count > 0) {
tree( length, thickness, count - 1, m * mt(0, length) * mr(31.4159));
}
}
tree(len, thickness, levels);

We can generate the list of matrices in a recursive function first
and use the result in a for() module to generate the actual geometry.
// the identity matrix
identity = [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ] ];
// generate 4x4 rotation matrix around Z axis
function mr(a) = [ [ cos(a), -sin(a), 0, 0 ], [ sin(a), cos(a), 0, 0 ], [ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ] ];
// generate 4x4 translation matrix
function mt(x, y) = [ [ 1, 0, 0, x ], [ 0, 1, 0, y ], [ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ] ];
function matrices(i = 10, m = identity, ret = []) = i >= 0
? matrices(i - 1, m * mt(0, 10) * mr(20), concat(ret, [ m ]))
: ret;
for (m = matrices(17))
multmatrix(m)
cube([5, 10, 5]);
with help form Torsten Paul.

Related

How to render a structured mesh in Octave

I would like to recreate this sort of "cubic" surface rendering in GNU Octave:
[From AEG Mesher documentation]
How can I achieve this, given a list of coordinates which represent a surface or volume in a structured grid?
Obviously there's probably much more elaborate frameworks out there, but just to demonstrate the concept: the idea that you can only work with triangular patches is incorrect. You can specify your own patches as elaborately as you want.
In the following example, I create a simple function which draws a 3D cube 'patch', to be treated as a 'pixel' element in a structured 'mesh'.
function drawpatchpixel( x, y, z, c )
Vertices = [ 0, 0, 0
0, 1, 0
1, 1, 0
1, 0, 0
0, 0, 1
0, 1, 1
1, 1, 1
1, 0, 1 ];
Faces = [ 1, 2, 3, 4 # front
2, 6, 7, 3 # top
5, 6, 7, 8 # back
1, 5, 8, 4 # bottom
1, 2, 6, 5 # left
4, 3, 7, 8 ]; # right
patch( 'Faces', Faces, 'Vertices', Vertices + [x, y, z], 'facecolor', c )
endfunction
Then I simply draw the pixels in the preferred colour:
Pixels = { 0, 0, 0, 'r'; # base
1, 0, 0, 'r';
2, 0, 0, 'r';
3, 0, 0, 'r';
4, 0, 0, 'r';
4, 1, 0, 'r';
4, 2, 0, 'r';
4, 3, 0, 'r';
4, 4, 0, 'r';
3, 4, 0, 'r';
2, 4, 0, 'r';
1, 4, 0, 'r';
0, 4, 0, 'r';
0, 3, 0, 'r';
0, 2, 0, 'r';
0, 1, 0, 'r';
0, 0, 1, [0.5, 0.5, 0.5]; # pillars
0, 0, 2, [0.5, 0.5, 0.5];
0, 0, 3, [0.5, 0.5, 0.5];
0, 0, 4, [0.5, 0.5, 0.5];
4, 0, 1, [0.5, 0.5, 0.5];
4, 0, 2, [0.5, 0.5, 0.5];
4, 0, 3, [0.5, 0.5, 0.5];
4, 0, 4, [0.5, 0.5, 0.5];
4, 4, 1, [0.5, 0.5, 0.5];
4, 4, 2, [0.5, 0.5, 0.5];
4, 4, 3, [0.5, 0.5, 0.5];
4, 4, 4, [0.5, 0.5, 0.5];
0, 4, 1, [0.5, 0.5, 0.5];
0, 4, 2, [0.5, 0.5, 0.5];
0, 4, 3, [0.5, 0.5, 0.5];
0, 4, 4, [0.5, 0.5, 0.5];
0, 1, 4, 'g'; # roof
0, 2, 4, 'g';
0, 3, 4, 'g';
4, 1, 4, 'g';
4, 2, 4, 'g';
4, 3, 4, 'g';
1, 0, 4, 'g';
2, 0, 4, 'g';
3, 0, 4, 'g';
1, 4, 4, 'g';
2, 4, 4, 'g';
3, 4, 4, 'g';
};
NPixels = size( Pixels, 1 );
for i = 1 : NPixels
drawpatchpixel( Pixels{i, :} )
endfor
axis equal
view( 30, 30 )
xlabel( 'x'); ylabel('y'), zlabel('z');
camlight
Result:

How to create a Mesh from normals and uv in Unity?

Hi I have this data coming from an API and I know it is a cube:
{
"position": {
"itemSize": 3,
"type": "Float32Array",
"array": [
0.5,
0.5,
0.5,
0.5,
0.5,
-0.5,
0.5,
-0.5,
0.5,
0.5,
-0.5,
-0.5,
-0.5,
0.5,
-0.5,
-0.5,
0.5,
0.5,
-0.5,
-0.5,
-0.5,
-0.5,
-0.5,
0.5,
-0.5,
0.5,
-0.5,
0.5,
0.5,
-0.5,
-0.5,
0.5,
0.5,
0.5,
0.5,
0.5,
-0.5,
-0.5,
0.5,
0.5,
-0.5,
0.5,
-0.5,
-0.5,
-0.5,
0.5,
-0.5,
-0.5,
-0.5,
0.5,
0.5,
0.5,
0.5,
0.5,
-0.5,
-0.5,
0.5,
0.5,
-0.5,
0.5,
0.5,
0.5,
-0.5,
-0.5,
0.5,
-0.5,
0.5,
-0.5,
-0.5,
-0.5,
-0.5,
-0.5
],
"normalized": false
},
"normal": {
"itemSize": 3,
"type": "Float32Array",
"array": [
1,
0,
0,
1,
0,
0,
1,
0,
0,
1,
0,
0,
-1,
0,
0,
-1,
0,
0,
-1,
0,
0,
-1,
0,
0,
0,
1,
0,
0,
1,
0,
0,
1,
0,
0,
1,
0,
0,
-1,
0,
0,
-1,
0,
0,
-1,
0,
0,
-1,
0,
0,
0,
1,
0,
0,
1,
0,
0,
1,
0,
0,
1,
0,
0,
-1,
0,
0,
-1,
0,
0,
-1,
0,
0,
-1
],
"normalized": false
},
"uv": {
"itemSize": 2,
"type": "Float32Array",
"array": [
0,
1,
1,
1,
0,
0,
1,
0,
0,
1,
1,
1,
0,
0,
1,
0,
0,
1,
1,
1,
0,
0,
1,
0,
0,
1,
1,
1,
0,
0,
1,
0,
0,
1,
1,
1,
0,
0,
1,
0,
0,
1,
1,
1,
0,
0,
1,
0
],
"normalized": false
}
}
How can I now create from these data a cube and its material in Unity? Is there a library or a built-in function?
First in general for parsing your JSON data into useful structure you need to have an according class structure and the use e.g. JsonUtility
[Serializable]
public class DataSet
{
public int itemSize;
public int[] array;
public bool normalized;
}
[Serializable]
public class Example
{
public DataSet position;
public DataSet normal;
public DataSet uv;
}
and do
var data = JsonUtility.FromJson<Example>(yourJsonString);
Next this data is still quite raw and we have to parse it further since we want valid vector values
var vertices = new List<Vector3>();
for(var i = 0; i < data.position.array.Length; i+=3)
{
if(i+2 > data.position.array.Length - 1) break;
var x = data.position.array[i];
var y = data.position.array[i+1];
var z = data.position.array[i+2];
vertices.Add(new Vector3(x,y,z));
}
And similar for normals and UVs(just that here you use Vector2 instead)
Then to the main question: Since you already have positions (I assume vertices), normals and UVs I guess you are wondering where to get the triangles from.
UVs don't help here at all since they are only texture coordinates defining how the texture is later mapped on triangles.
Also the normals can't really help you here. A normal is just a direction and doesn't provide any helpful information about which three vertices together make up a triangle.
To get the triangles would only be possible if you know e.g. that always 3 sequential vertices make up a triangle - meaning your mesh has duplicate vertices.
Otherwise I'ld say it is not possible to know that triangles from your given data.
In Unity the triangles is simply a flat int[] where always three sequential elements are the indexes of the three vertices from the vertices array.
So under the one assumption that they are just consequent something like
var triangles = new int[vertices.Length];
for(var i = 0; i < triangles.Length; i++)
{
triangles[i] = i;
}
Then you could simply put it all together and create a mesh like
var mesh = new Mesh();
mesh.vertices = vertices;
mesh.triangles = triangles;
// Etc

How to count the elements of a sparse matrix in a certain region?

I have a sparse matrix and want to divide the region into 4 parts, dividing x and y in 2 equidistant pieces and want to calculate the sum of the corresponding values.
For the example below, the coordinates x-y each corresponds to [0,16] so the region is a square. There is a sparse matrix in this square, which is symmetrical. I would like to divide the region into smaller squares and sum up the sparse values. Region 0:8,0:8 has 2 elements and their values are both (2,3)=(3,2)=8 so the sum is 16.
Summation of the 1st region should give 16, 2nd and 3rd are 36 and the 4th one is 26.
x = sparse(16,16);
x (3,2) = 8;
x (10,2) = 8;
x (13,2) = 8;
x (14,2) = 4;
x (15,2) = 4;
x (2,3) = 8;
x (10,3) = 4;
x (13,3) = 4;
x (14,3) = 2;
x (15,3) = 2;
x (2,10) = 8;
x (3,10) = 4;
x (13,10) = 4;
x (14,10) = 2;
x (15,10) = 2;
x (2,13) = 8;
x (3,13) = 4;
x (10,13) = 4;
x (14,13) = 2;
x (15,13) = 2;
x (2,14) = 4;
x (3,14) = 2;
x (10,14) = 2;
x (13,14) = 2;
x (15,14) = 1;
x (2,15) = 4;
x (3,15) = 2;
x (10,15) = 2;
x (13,15) = 2;
x (14,15) = 1;
i would rather appriciate a shorter way, rather than writing a line for each sub-square. lets say for 6000 sub-squares one should write 6000 lines?
Let's define the input in a more convenient way:
X = sparse([...
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 8, 0, 0, 0, 0, 0, 0, 8, 0, 0, 8, 4, 4
0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 4, 2, 2
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 8, 4, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 2, 2
0, 4, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 1
0, 4, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 1, 0]);
For convenience, we first make the array dimensions even. We don't use padarray() for this because this makes the sparse matrix full!
sz = size(X);
newX = sparse(sz(1)+1,sz(2)+1);
padTopLeft = true; % < chosen arbitrarily
if padTopLeft
newX(2:end,2:end) = X;
else % bottom right
newX(1:sz(1),1:sz(2)) = X;
end
%% Preallocate results:
sums = zeros(2,2,2);
Method #1: accumarray
We create a mask of the form:
1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2
1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2
1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2
1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2
1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2
1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2
1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2
1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2
3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4
3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4
3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4
3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4
3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4
3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4
3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4
3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4
and then use it to sum the appropriate elements of newX:
sums(:,:,1) = reshape(...
accumarray(reshape(repelem([1,2;3,4], ceil(sz(1)/2), ceil(sz(2)/2)),[],1),...
reshape(newX, [],1),...
[],#sum) ,2,2);
Method #2: blockproc (requires the Image Processing Toolbox)
sums(:,:,2) = blockproc(full(newX), ceil(sz/2), #(x)sum(x.data(:)));
Several notes:
I also tried histcounts2, which is very short, but it only tells you the amount of values in each quadrant, not their sum:
[r,c] = find(newX);
histcounts2(r,c,[2,2])
I might've overcomplicated the accumarray solution.
Although your question is not very precise and you don't made any efford to find a solution, here is what you are asking..
clear;clc;close;
Matrix=rand(20,20);
Acc=zeros(1,4);
Acc(1)=sum(sum( Matrix(1:size(Matrix,1)/2,1:size(Matrix,2)/2) ));
Acc(2)=sum(sum( Matrix((size(Matrix,1)/2)+1:end,1:size(Matrix,2)/2)));
Acc(3)=sum(sum( Matrix(1:size(Matrix,1)/2,((size(Matrix,2)/2)+1):end )));
Acc(4)=sum(sum( Matrix((size(Matrix,1)/2)+1:end,((size(Matrix,2)/2)+1):end)));
% Verification
sum(sum(Matrix)) % <- is the same with
sum(Acc) % <- this
You can define any rectangle within the matrix by defining the 4 corners of it. Then use a for loop to process all rectangles.
regions = [
1 8 1 8
9 16 1 8
1 8 9 16
9 16 9 16
];
regionsum = zeros(size(regions,1),1);
for rr = 1:size(regions,1)
submat = x(regions(rr,1):regions(rr,2),regions(rr,3):regions(rr,4));
regionsum(rr) = sum(submat(:));
end
>> regionsum
regionsum =
16
36
36
26
If you mean you want to divide the square matrix into 2^N (N>2) squares of the same size then you can write regions with a for loop.
N = 1; % 2^N-by-2^N sub-squares
L = size(x,1);
dL = L/(2^N);
assert(dL==int32(dL),'Too many divisions')
segments = zeros(2^N,2);
for nn = 1:2^N
segments(nn,:) = [1,dL]+dL*(nn-1);
end
regions = zeros(2^(2*N),4);
for ss = 1:2^N
for tt = 1:2^N
regions((2^N)*(ss-1) + tt,:) = [segments(ss,:),segments(tt,:)];
end
end
example output with dividing into 16 (N=2) square submatrices:
>> regions
regions =
1 4 1 4
1 4 5 8
1 4 9 12
1 4 13 16
5 8 1 4
5 8 5 8
5 8 9 12
5 8 13 16
9 12 1 4
9 12 5 8
9 12 9 12
9 12 13 16
13 16 1 4
13 16 5 8
13 16 9 12
13 16 13 16
>> regionsum
regionsum =
16
0
12
24
0
0
0
0
12
0
0
8
24
0
8
10
>>

How to carry out a counter number in parallel_for_each

1)Why the variable length in my sample code are not 62 after calculate ? It's
seems every time the condition is satisfied,but enter the condition,
the number "length not be added every single time.
2)If I don't use concurrency::array length(1, 1, &V[0]); to save counter
but using tile_static int, the length is also wrong.
//if my 8 x 8 local data are:
//cache[TS][TS]
//{
// -69, 0, 0, 1, 0, 0, 0, 0,
// 0, 0, 0, 0, 0, 0, 0, 0,
// 0, 0, 0, 0, 0, 0, 0, 0,
// 0, 0, 0, 0, 0, 0, 0, 0,
// 0, 0, 0, 0, 0, 0, 0, 0,
// 0, 0, 0, 0, 0, 0, 0, 0,
// 0, 0, 0, 0, 0, 0, 0, 0,
// 0, 0, 0, 0, 0, 0, 0, 0
//}
My sample code:
void sample()
{
std::vector<int> V;
V.push_back(0);
concurrency::array<int, 2> length(1, 1, &V[0]);
const int TS = 8;
concurrency::parallel_for_each(data.extent.tile<TS, TS>(), [=, &length](tiled_index<TS, TS> index) restrict(amp)
{
const int row = index.local[0];
const int col = index.local[1];
//tile_static int length; ---------2)
tile_static int cache[TS][TS];
cache[row][col] = data[index.global];
index.barrier.wait();
if (cache[row][col] == 0)
{
//length++; -------------------2)
length[0][0] = length[0][0] + 1;
}
});
}
std::vector<int> V;
for (int i = 0; i < 256; i++)
V.push_back(0);
concurrency::array_view<int, 1> AC_count(256, &V[0]);
const int TS = 8;
concurrency::parallel_for_each(data.extent.tile<TS, TS>(), [=, &length](tiled_index<TS, TS> index) restrict(amp)
{
const int row = index.local[0];
const int col = index.local[1];
tile_static int cache[TS][TS];
cache[row][col] = data[index.global];
index.barrier.wait();
if (cache[row][col] == 0)
{
atomic_fetch_add(&AC_count[0], 1);
}
});
}

Why matbugs never stops running?

I can run a model in WinBUGS14 with no problem and get the results, but I get a problem when I run the same WinBUGS model (shown as below) from MatLab. It looks the program never stops running and no results return.
Can anyone help me. Any advice will be greatly appreciated. Thanks.
1) my WinBUGS Code --- CHK_model.txt
model {
for(i in 1: N) {
CF01[i] ~ dnorm(0, 20)
CF02[i] ~ dnorm(0, 1)
h[i] ~ dpois (lambda [i])
log(lambda [i]) <- beta0 + beta1*CF03[i] + beta2*CF02[i] + beta3*CF01[i] + beta4*IND[i]
}
beta0 ~ dnorm(0.0, 1.0E-6)
beta1 ~ dnorm(0.0, 1.0E-6)
beta2 ~ dnorm(0.0, 1.0E-6)
beta3 ~ dnorm(0.0, 1.0E-6)
beta4 <- log(p)
p ~ dunif(lower, upper)
}
2) my MatLab Code
dataStruct = struct( ...
'N', 155, ...
'lower', 0.80, ...
'upper', 0.95, ...
'h',[1, 4, 1, 2, 1, 2, 1, 1, 1, 3, 3, 0, 0, 0, 2, 0, 1, 0, 4, 2, ...
3, 0, 2, 1, 1, 2, 2, 2, 3, 4, 2, 3, 1, 0, 1, 3, 3, 3, 1, 0, 1, ...
0, 5, 2, 1, 2, 1, 3, 3, 1, 1, 0, 2, 2, 0, 3, 0, 0, 3, 2, 2, 2, ...
1, 0, 3, 3, 1, 1, 1, 2, 1, 0, 1, 2, 1, 2, 0, 2, 1, 0, 0, 2, 5, ...
0, 2, 1, 0, 2, 1, 2, 2, 2, 0, 3, 2, 1, 3, 3, 3, 3, 0, 1, 3, 3, ...
3, 1, 0, 0, 1, 2, 1, 0, 1, 4, 1, 1, 1, 1, 2, 1, 3, 0, 0, 1, 1, ...
1, 1, 0, 2, 1, 0, 0, 1, 1, 5, 1, 1, 1, 3, 0, 1, 1, 1, 0, 2, 1, ...
0, 3, 3, 0, 0, 1, 2, 6, nan], ...
'CF03',[-1.575, 0.170, -1.040, -0.010, -0.750, ...
0.665, -0.250, 0.145, -0.345, -1.915, -1.515, ...
0.215, -1.040, -0.035, 0.805, -0.860, -1.775, ...
1.725, -1.345, 1.055, -1.935, -0.160, -0.075, ...
-1.305, 1.175, 0.130, -1.025, -0.630, 0.065, ...
-0.665, 0.415, -0.660, -1.145, 0.165, 0.955, ...
-0.920, 0.250, -0.365, 0.750, 0.045, -2.760, ...
-0.520, -0.095, 0.700, 0.155, -0.580, -0.970, ...
-0.685, -0.640, -0.900, -0.250, -1.355, -1.330, ...
0.440, -1.505, -1.715, -0.330, 1.375, -1.135, ...
-1.285, 0.605, 0.360, 0.705, 1.380, -2.385, -1.875, ...
-0.390, 0.770, 1.605, -0.430, -1.120, 1.575, 0.440, ...
-1.320, -0.540, -1.490, -1.815, -2.395, 0.305, ...
0.735, -0.790, -1.070, -1.085, -0.540, -0.935, ...
-0.790, 1.400, 0.310, -1.150, -0.725, -0.150, ...
-0.640, 2.040, -1.180, -0.235, -0.070, -0.500, ...
-0.750, -1.450, -0.235, -1.635, -0.460, -1.855, ...
-0.925, 0.075, 2.900, -0.820, -0.170, -0.355, ...
-0.170, 0.595, 0.655, 0.070, 0.330, 0.395, 1.165, ...
0.750, -0.275, -0.700, 0.880, -0.970, 1.155, 0.600, ...
-0.075, -1.120, 1.480, -1.255, 0.255, 0.725, ...
-1.230, -0.760, -0.380, -0.015, -1.005, -1.605, ...
0.435, -0.695, -1.995, 0.315, -0.385, -0.175, ...
-0.470, -1.215, 0.780, -1.860, -0.035, -2.700, ...
-1.055, 1.210, 0.600, -0.710, 0.425, 0.155, -0.525, ...
-0.565], ...
'CF02',[nan, nan, nan, nan, nan, nan, nan, nan, nan, ...
nan, nan, nan, nan, nan, nan, 0.38, 0.06, -0.94, ...
-0.02, -0.28, -0.78, -0.95, 2.33, 1.43, 1.24, 1.26, ...
-0.75, -1.5, -2.09, 1.01, -0.05, 2.48, 2.48, 0.46, ...
0.46, -0.2, -1.11, 0.52, -0.37, 0.58, 0.86, 0.59, ...
-0.12, -1.33, 1.4, -1.84, -1.4, -0.76, -0.23, ...
-1.78, -1.43, 1.2, 0.32, 1.87, 0.43, -1.71, -0.54, ...
-1.25, -1.01, -1.98, 0.52, -1.07, -0.44, -0.24, ...
-1.31, -2.14, -0.43, 2.47, -0.09, -1.32, -0.3, ...
-0.99, 1.1, 0.41, 1.01, -0.19, 0.45, -0.07, -1.41, ...
0.87, 0.68, 1.61, 0.36, -1.06, -0.44, -0.16, 0.72, ...
-0.69, -0.94, 0.11, 1.25, 0.33, -0.05, 0.87, -0.37, ...
-0.2, -2.22, 0.26, -0.53, -1.59, 0.04, 0.16, -2.66, ...
-0.21, -0.92, 0.25, -1.36, -1.62, 0.61, -0.2, 0, ...
1.14, 0.27, -0.64, 2.29, -0.56, -0.59, 0.44, -0.05, ...
0.56, 0.71, 0.32, -0.38, 0.01, -1.62, 1.74, 0.27, 0.97, ...
1.22, -0.21, -0.05, 1.15, 1.49, -0.15, 0.05, -0.87, ...
-0.3, -0.08, 0.5, 0.84, -1.67, 0.69, 0.47, 0.44, ...
-1.35, -0.24, -1.5, -1.32, -0.08, 0.76, -0.57, ...
-0.84, -1.11, 1.94, -0.68], ...
'CF01',[nan, nan, nan, nan, nan, nan, nan, nan, nan, ...
nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, ...
nan, -0.117, -0.211, -0.333, -0.229, -0.272, ...
-0.243, -0.148, 0.191, -0.263, -0.239, -0.168, ...
-0.381, -0.512, -0.338, -0.296, 0.067, 0.104, ...
-0.254, -0.167, -0.526, -0.096, -0.43, 0.013, ...
-0.438, -0.297, -0.131, -0.098, -0.046, -0.063, ...
-0.194, -0.155, -0.645, -0.603, -0.374, -0.214, ...
-0.165, -0.509, -0.171, -0.442, -0.468, -0.289, ...
-0.427, -0.519, -0.454, 0.046, -0.275, -0.401, ...
-0.542, -0.488, -0.52, -0.018, -0.551, -0.444, ...
-0.254, -0.286, 0.048, -0.03, -0.015, -0.219, ...
-0.029, 0.059, 0.007, 0.157, 0.141, -0.035, 0.136, ...
0.526, 0.113, 0.22, -0.022, -0.173, 0.021, -0.027, ...
0.261, 0.082, -0.266, -0.284, -0.097, 0.097, -0.06, ...
0.397, 0.315, 0.302, -0.026, 0.268, -0.111, 0.084, ...
0.14, -0.073, 0.287, 0.061, 0.035, -0.022, -0.091, ...
-0.22, -0.021, -0.17, -0.184, 0.121, -0.192, ...
-0.24, -0.283, -0.003, -0.45, -0.138, -0.143, ...
0.017, -0.245, 0.003, 0.108, 0.015, -0.219, 0.09, ...
-0.22, -0.004, -0.178, 0.396, 0.204, 0.342, 0.079, ...
-0.034, -0.122, -0.24, -0.125, 0.382, 0.072, 0.294, ...
0.577, 0.4, 0.213, 0.359, 0.074, 0.388, 0.253, 0.167], ...
'IND',[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
Nchains = 3;
clear initStructs;
for i=1:Nchains
S.beta0 = 0;
S.beta1 = 0;
S.beta2 = 0;
S.beta3 = 0;
S.P = 0.9;
initStructs(i) = S;
end
bugsFolder = 'C:\Program Files\winbugs14\WinBUGS14';
[samples, stats] = matbugs(dataStruct, ...
fullfile(pwd, 'CHK_model.txt'), ...
'init', initStructs, ...
'view', 0, 'nburnin', 1000, 'nsamples', 5000, ...
'thin', 10, ...
'monitorParams', {'theta', 'mu_theta', 'sigma_theta'}, ...
'Bugdir', bugsFolder);
# N t, thank you so much for your help. I don't know why I cannot response to you by using 'Post your answer". So I response here:
I download the matbugs.m from a website (http://code.google.com/p/matbugs/) and didn't touch this program at all.
When I run the Matlab code (as shown in my post), the computation goes to WinBUGS interface and stops there. Three WinBUGS windows pop up: the first one is WinBUGS Licence window, the second one is Log window, and the third one is Trap window.
1) here is the Log Window; .... data loaded compile(3) model compiled inits(1,
2) here is the Trap Wind ... (pc=764962F9H, fp=0028FB3CH) (pc=76496D39H, fp=0028FBB4H) (pc=764977C3H, fp=0028FC14H) (pc=76497BC9H, fp=0028FC24H) HostMenus.Loop [00003BDEH] .done BOOLEAN FALSE .f SET {0..5} .n INTEGER 0 .res INTEGER 0 .w HostWindows.Window NIL Kernel.Start [00002B8CH] .code PROCEDURE HostMenus.Loop
3) The program of matbugs.m is too long to post here, but I used exactly same program as this one http://code.google.com/p/matbugs/source/browse/trunk/matbugs.m
Thanks again for your time and for your advice!
Bo