Betreff: Wählen Sie 2 Reihen aus dem fehlerhaften Würfel ausVielleicht so etwas
dtt = Open( "/Z:/failures.jmp" );// 109 inner rows
expand = 2;// how far to look for a failure
// these are paired, keep them in a Nx2 matrix...
fail = (dtt:X coord << get values) || (dtt:Y coord << get values);
// get min and max of the matrix columns
failmin = V Min( fail );
failmax = V Max( fail );
// find the +/- 2 area of interest
colmin = failmin[1] - expand;
colmax = failmax[1] + expand;
rowmin = failmin[2] - expand;
rowmax = failmax[2] + expand;
// turn the failure list back into a rectangular matrix, mark the actual failures
unmarked = 0; // points that have not been marked yet
interior = 1; // the failures are interior points
border = 2; // the border points are near the failures
bigpatch = J( rowmax + 1, colmax + 1, unmarked );
For Each( {{r, c}}, across( fail[0, 2], fail[0, 1] ), bigpatch[r, c] = interior );
// helper to check near r,c
nearFailure = Function( {r0, c0}, //parameters
{rlow, rhigh, clow, chigh, r, c}, // locals
// low..high is expanded without going beyond the edge of bigpatch
rlow = Max( 1, r0 - expand );
rhigh = Min( N Rows( bigpatch ), r0 + expand );
clow = Max( 1, c0 - expand );
chigh = Min( N Cols( bigpatch ), c0 + expand );
// rlow..chigh is a slightly expanded search area
For( r = rlow, r <= rhigh, r += 1,
For( c = clow, c <= chigh, c += 1,
// any interior point (1) nearby?
If(
bigpatch[r, c] == interior// uncomment for "rounder"
// & Sqrt( (r - r0) ^ 2 + (c - c0) ^ 2 ) <= expand// the diagonal distance of the corners is expand*1.414...nearly 3...
,
Return( 1 ) // found an interior point nearby
)
)
);
/*return*/ 0; // no interior point found nearby
);
For( r = rowmin, r <= rowmax, r += 1,
For( c = colmin, c <= colmax, c += 1,
If( bigpatch[r, c] == unmarked & nearFailure( r, c ),
bigpatch[r, c] = border// add a border to the bigpatch
)
)
);
// view a cellplot
dtcp = As Table( bigpatch[rowmin - 1 :: rowmax + 1, colmin - 1 :: colmax + 1] );
dtcp[1 :: N Rows( dtcp ), 0] = dtcp[N Rows( dtcp ) :: 1, 0];// flip to make the same as graph builder
dtcp << Cell Plot( Scale Uniformly( 0 ), Center at zero( 0 ), Y( dtcp << getcolumnnames ) );
dt = Open( "/Z:/Summary Bins.jmp" );// all rows
//Clear values
dt:Highlight[1 :: N Rows( dt )] = "";
//Loop to highlight 2 dies
dt << Begin Data Update;
For( i = 1, i <= N Rows( dt ), i++,
c = dt:X coord[i];
r = dt:Y coord[i];
If( r < N Rows( bigpatch ) & c < N Cols( bigpatch ) & bigpatch[r, c] == border,
dt:Highlight[i] = "1"
);
);
dt << End Data Update;
dt << select where( :Highlight == "1" & :Bins == "1" );
dt << Graph Builder( Size( 528, 454 ), Show Control Panel( 0 ), Variables( X( :X coord ), Y( :Y coord ) ), Elements( Points( X, Y, Legend( 7 ) ) ) );
Vielleicht möchten Sie das

oder dies, siehe die kommentierte Zeile für die Entfernungsberechnung. Hängt davon ab, wie Sie den diagonalen Abstand behandeln möchten.

Betreff: Wählen Sie 2 Reihen aus dem fehlerhaften Würfel ausVielen Dank, Craige
Wählen Sie 2 Zeilen ausHallo JMP-Community,
Ich möchte zwei Datenpunkte aus den jeweiligen X- und Y-Koordinaten des Fehlerbereichs „2“ hervorheben. Ich habe versucht, einen JSL-Code zu schreiben, aber die Ergebnisse sind nicht korrekt.
Der folgende Code hebt mehr als zwei Datenpunkte aus den X- und Y-Koordinaten des Fehlerbereichs „2“ hervor. Irgendwelche Vorschläge?
Hier ist der Code
Names Default To Here( 1 );
dtt = Data Table( "failures" );
dt = Data Table( "Summary Bins" );
//Clear values
dt:Highlight[1 :: N Rows( dt )] = "";
//define list for storing +/-2 X and Y coord in the list
xList = [];
yList = [];
//get X and Y coord of the failing dies
fail_xcoord = dtt:X coord << get values;
fail_ycoord = dtt:Y coord << get values;
// Add and subtract 2 from X and Y using a loop
For( j = 1, j <= N Rows( dtt ), j++,
For( i = -2, i <= 2, i++,
newX = dtt:X coord[j] + i;
newY = dtt:Y coord[j] + i;
If( newX != dtt:X coord[j],
Insert Into( xList, newX )
);
If( newY != dtt:Y coord[j],
Insert Into( yList, newY )
);
)
);
//Loop to highlight 2 dies
dt << Begin Data Update;
For( i = 1, i <= N Rows( dt ), i++,
If( Contains( xlist, dt:X coord[i] ) & Contains( fail_ycoord, dt:Y coord[i] ),
dt:Highlight[i] = "1";
);
If( Contains( ylist, dt:Y coord[i] ) & Contains( fail_xcoord, dt:X coord[i] ),
dt:Highlight[i] = "1";
);
);
dt << End Data Update;
dt << select where( :Highlight == "1" & :Bins == "1" );
Danke,
Jackie
Automatisierung und SkripterstellungBetreff: Wählen Sie 2 Reihen aus dem fehlerhaften Würfel aus Ich verstehe nicht, was Sie mit der Auswahl von 2 Würfeln aus der fehlerhaften Region meinen - Ich möchte einen dickeren Rand.
Wenn ich beispielsweise in der Legende „40“ auswähle (siehe unten), möchte ich einen dicken Rahmen aus +2 Würfeln um diesen Bereich herum hinzufügen. Diese spezielle Wafer-Karte hat die X- und Y-Koordinaten im Negativ und funktioniert mit der Funktion nearFailure()

Etwas vergrößert:
Etwas wie das. Ich habe manuell 2 Punkte aus dem ausgewählten Bereich ausgewählt, in diesem Fall Bin „40“ rote Datenpunkte. Die Absicht hierfür besteht also darin, einen Ausschluss von +2 Würfeln (einen dicken Rand) um den ausgewählten Zeilenbereich herum anzuwenden.

Etwas Ähnliches wie das, was Sie erwähnt haben. Im folgenden Fall gibt es einen dicken Rand (rot).

Betreff: Wählen Sie 2 Reihen aus dem fehlerhaften Würfel ausIch denke, Option 2 wäre sinnvoller. Ich würde mich freuen, wenn Sie mir die geänderte Matrixlogik für den großen Patch mitteilen könnten. Ich bin mir nicht ganz sicher, wie ich das beheben soll
Betreff: Wählen Sie 2 Reihen aus dem fehlerhaften Würfel ausSie könnten so etwas versuchen. Ich denke, es ist ein besserer Ansatz, wird aber wahrscheinlich seine eigenen Probleme mit sich bringen, also testen Sie es sorgfältig.
// all new code, all new bugs, check carefully to see if this does what you want
dtt = Open( "/Z:/failures(2).jmp" );
dtS = Open( "/Z:/Summary Bins(2).jmp" );
// the X-Y die coordinates are expected to be integers between -9,999,996 and +9,999,996
encodeLimit = 1e7; // pack/unpack two signed 7-digit integers in one 14-digit number
// a "key" is an X-Y pair packed into a single number. It is called a key
// because it is used as a key in an associative array. These next two
// routines convert between the two representations
keysToXY = Function( {keys},
{x, y},
x = Round( keys / encodeLimit );
y = keys - x * encodeLimit;
x || y;
);
XYtoKeys = Function( {xy},
xy[0, 1] * encodeLimit + xy[0, 2]
);
// load the X-Y pairs that describe failure positions
failXY = dtt[0, {x coord, y coord}];
// elementary sanity checks
If( Any( failXY <= -encodeLimit + 4 ) | Any( failXY >= encodeLimit - 4 ),
Throw( "data range" )
);
If( Any( failXY != Floor( failXY ) ),
Throw( "integer coords" )
);
// convert X-Y failure locations to keys, verify they convert back again
failkeys = XYtoKeys( failXY );
If( !All( keysToXY( failkeys ) == failXY ),
Throw( "encode/decode 1" )
);
// template for nearby points. THIS TABLE ENCODES THE 2 PIXEL BORDER.
// you might, or might not, want the corners included; the corners are
// commented out because I like the rounded appearance better.
template = [
//-2 -2, // corner
-2 -1,
-2 0,
-2 1,
//-2 2, // corner
-1 -2,
-1 -1,
-1 0,
-1 1,
-1 2,
0 -2,
0 -1,
0 0, // center
0 1,
0 2,
1 -2,
1 -1,
1 0,
1 1,
1 2,
// 2 -2, // corner
2 -1,
2 0,
2 1
//, 2 2 // corner
];
// convert the template X-Y pairs into keys, verify they convert back again
templatekeys = XYtoKeys( template );
If( !All( keysToXY( templatekeys ) == template ),
Throw( "encode/decode 2" )
);
// somthing very cool is going to happen next: template keys will be added to a failure
// key to get a set of keys around the failure key. The template, above, represents a
// square (with rounded corners) about an origin. Adding a failure key moves the
// origin to the X-Y failure point. All the nearby locations are then inserted into a
// collection (associative array) of points that are within 2 of a failure point.
// When done, the actual failure points are removed from the collection, leaving the
// collection as the 2-wide border.
// use AssociativeArray as a set to hold the key values;
// the nearbyPoint set gets populated with both the failure
// points AND the points that are nearby as identified by the template.
nearbyPoints = Associative Array();
For Each( {failkey}, failkeys,
nearbykeys = failkey + templatekeys; // nearby is the same shape as template, but at failkey, not 0,0
nearbyPoints << Insert( Associative Array( nearbykeys ) );
);
// now remove the set of points formed from all the failures...after this,
// nearbypoints is the 2-cell boundary without the interior.
nearbyPoints << Remove( Associative Array( failkeys ) );
// now make a table for a plot. red are from the failures table, blue are the border.
border = keysToXY( Matrix( nearbypoints << getkeys ) ) || J( N Items( nearbypoints ), 1, 1 );
center = failXY || J( N Rows( failXY ), 1, 2 );
dtg = As Table( border |/ center, <<COLUMNNAMES></COLUMNNAMES>
<P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="capture.png" style="width: 921px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="capture.png" style="width: 921px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="capture.png" style="width: 921px;"><span class="lia-inline-image-display-wrapper" image-alt="capture.png" style="width: 921px;"><img src="https://us.v-cdn.net/6038925/uploads/images/61399i00F1D5DEBF613925/capture.png" role="button" title="capture.png" alt="capture.png" /></span></SPAN></SPAN></SPAN></P>Betreff: Wählen Sie 2 Reihen aus dem fehlerhaften Würfel aus@Craige_Hales
Du hast mein Leben einfacher gemacht. Vielen Dank, Craige!
Eine letzte Frage.
Ist es möglich, die Vorlagengröße dynamisch anzupassen? Ich versuche, ein Fenster mit einem Zahlenbearbeitungsfeld zu erstellen, in das der Benutzer die Anzahl der Pixelränder eingibt. Wenn der Pixelrand 3 ist, ist die Matrix n+1

// template for nearby points. THIS TABLE ENCODES THE 2 PIXEL BORDER.
// you might, or might not, want the corners included; the corners are
// commented out because I like the rounded appearance better.
template = [-2 -2, // corner
-2 -1, -2 0, -2 1, -2 2, // corner
-1 -2, -1 -1, -1 0, -1 1, -1 2, 0 -2, 0 -1, 0 0, // center
0 1, 0 2, 1 -2, 1 -1, 1 0, 1 1, 1 2, 2 -2, // corner
2 -1, 2 0, 2 1, 2 2 // corner
]
Betreff: Wählen Sie 2 Reihen aus dem fehlerhaften Würfel ausdas könnte funktionieren:
templatesize=15;
templateround = 1; // 0: square corners 1: round corners 2: diamond corners
templatelist = {};
for(x=-templatesize, x<=templatesize, x+=1,
for(y=-templatesize, y<=templatesize, y+=1,
if(templateround==0 // use all neighbor points
| (templateround==1 & round(sqrt(x^2+y^2))<=templatesize) // use neighbors near or inside the circle
| (templateround==2 & sqrt(x^2+y^2)<=templatesize) // use neighbors inside the circle
,//
templatelist[nitems(templatelist)+1] = evallist({x,y});
)
)
);
show(templatelist);
template = matrix(templatelist);
//astable(template)<<GRAPH builder=""></GRAPH>
<P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="capture.png" style="width: 999px;"><span class="lia-inline-image-display-wrapper" image-alt="capture.png" style="width: 999px;"><img src="https://us.v-cdn.net/6038925/uploads/images/61445i7D643065AD650CD1/capture.png" role="button" title="capture.png" alt="capture.png" /></span></SPAN></P>
<P> </P>